【问题标题】:Accessing ListView Adapter inside ViewPager在 ViewPager 中访问 ListView 适配器
【发布时间】:2015-05-09 12:40:17
【问题描述】:

我有什么

1) 我有一个 Activity,里面有一个 ActionBar 和一个片段。 2)在这个片段中,我有一个 ViewPager 显示 3-4 个片段。 3)在每个fragment里面,都有一个不同的ListView。

我想要什么

我想在 ActionBar 中实现 ListView 过滤器。这不是问题,但我无法访问 ViewPager 内不同列表的各个适配器,ViewPager 位于 Fragment 内。

@Override
public boolean onCreateOptionsMenu(Menu menu) {

    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_file_hide_main, menu);

    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));

    Fragment filesMain = getSupportFragmentManager().findFragmentByTag("FILES_MAIN");
    ViewPager viewPager = (ViewPager) filesMain.getView().findViewById(R.id.filesViewPager);
    if(viewPager.getAdapter() == null)
        Log.d("TAG", ADAPTER IS NULL");


    SearchView.OnQueryTextListener textChangeListener = new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextChange(String newText) {
            // this is your adapter that will be filtered
            //adapter.getFilter().filter(newText);
            return true;
        }

        @Override
        public boolean onQueryTextSubmit(String query) {
            // this is your adapter that will be filtered
            //adapter.getFilter().filter(query);
            return true;
        }
    };
    searchView.setOnQueryTextListener(textChangeListener);

    return true;
}

适配器始终为空,当用户滑动时,我也无法获取所有 ListView 的适配器。

请帮忙解决一下。

【问题讨论】:

  • 您在最初设置时没有对视图寻呼机适配器的引用吗?
  • ViewPager 在 Fragment 内部,但 onCreateOptionsMenu 在 Activity 内部。

标签: android-fragments android-listview android-viewpager android-adapter searchview


【解决方案1】:

定义一个接口:

public interface ViewPagerPageChangeListener{
    public void updateFragmentPosition(int position);
}

主要活动:

public class MyActivity extends FragmentActivity implements ViewPagerPageChangeListener(){

  @Override
  public void updateFragmentPosition(int position){
      switch(position){
          case 0 :
          FragmentOne fragmentOne = (FragmentOne)    mainFragment.getActiveFragment(currentPosition);
          break;
          case 1 : 
          FragmentTwo = fragmentTwo = (FragmentTwo) mainFragment.getActiveFragment(currentPosition);
          break;
      }
  }

}

在包含 ViewPager 的片段内部:

ViewPagerPageChangeListener listener = (ViewPagerPageChangeListener)getActivity();

mViewPager.setOnPageChangeListener(new OnPageChangeListener() {
        @Override
        public void onPageSelected(int pos) {
            currentPosition = pos;
            listener.updateFragmentPosition(pos);
        }

        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {
        }

        @Override
        public void onPageScrollStateChanged(int arg0) {
        }
    });

public Fragment getActiveFragment(){
    return fragmentPagerAdapter.getItem(position);
}

现在,FragmentOne、FragmentTwo 等是您的视图寻呼机中的片段。在这些片段中定义一个方法,该方法将更新它们各自列表中的值。

现在,只要当前项目在视图分页器中发生变化,您的主要活动就会收到通知。然后,您可以从 viewpager 中获取片段并更新当前可见的片段并将其转换为相关的片段类。

现在,当您进行搜索时,只需拨打fragmentOne.updateList(String filterText); or fragmentTwo.updateList(String filterText);

【讨论】:

    猜你喜欢
    • 2012-06-10
    • 1970-01-01
    • 1970-01-01
    • 2014-09-28
    • 1970-01-01
    • 1970-01-01
    • 2015-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多