【问题标题】:Using ViewPager with ListFragment and CursorAdapter将 ViewPager 与 ListFragment 和 CursorAdapter 一起使用
【发布时间】:2015-11-13 17:22:01
【问题描述】:

我有一个现有的应用程序,显示来自数据库的五个不同的条目列表。它使用左侧抽屉来选择显示哪个列表。

我想在这些列表中使用 ViewPager,但很难弄清楚它是如何工作的。不幸的是,我找不到解决这个问题的教程。

我有一个将 viewpagerAdapter 连接到的 MainActivity

MainActivity extends AppCompatActivity {
...
@Override
protected void onCreate(Bundle savedInstanceState) {
    ...
    // Setting the viewpager
    mPager = (ViewPager) findViewById(R.id.pager_container_home);
    mPagerAdapter = new EntriesListPagerAdapter(getSupportFragmentManager());
    mPager.setAdapter(mPagerAdapter);

...
}

private class EntriesListPagerAdapter extends FragmentPagerAdapter {
  ...


     @Override
     public Object instantiateItem(ViewGroup container, int position) {


         // What to put here???

         return view;
    }
}

我有一个 ListFragment 类从 ResourceCursorAdapter(称为 EntriesCursorAdapter)获取数据。这是一堂很长的课,所以我给出了一些部分来给你一个想法。

public class EntriesListFragment extends ListFragment {

...


    @Override
    public Loader<Cursor> onCreateLoader(int id, Bundle args) {
    ...
        @Override
        public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
            mEntriesCursorAdapter.swapCursor(data);
        }

        @Override
        public void onLoaderReset(Loader<Cursor> loader) {
            mEntriesCursorAdapter.swapCursor(Constants.EMPTY_CURSOR);
        }
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        setHasOptionsMenu(true);
        super.onCreate(savedInstanceState);

        if (savedInstanceState != null) {
            mUri = savedInstanceState.getParcelable(STATE_URI);
            mShowFeedInfo = savedInstanceState.getBoolean(STATE_SHOW_FEED_INFO);
            mListDisplayDate = savedInstanceState.getLong(STATE_LIST_DISPLAY_DATE);

            mEntriesCursorAdapter = new EntriesCursorAdapter(getActivity(), mUri, Constants.EMPTY_CURSOR, mShowFeedInfo);
        }
    }


    @Override
    public View inflateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_entry_list, container, true);

        if (mEntriesCursorAdapter != null) {
            setListAdapter(mEntriesCursorAdapter);
        }

        mListView = (ListView) rootView.findViewById(android.R.id.list);

        ...
    }

   public void setData(Uri uri, boolean showFeedInfo) {
       mUri = uri;
       mShowFeedInfo = showFeedInfo;

       mEntriesCursorAdapter = new EntriesCursorAdapter(getActivity(), mUri, Constants.EMPTY_CURSOR, mShowFeedInfo);

    }

您能帮我创建五个列表片段实例(使用 cursoradapter)并将其连接到 MainActivity 中的 ViewPager 吗?欢迎任何提示如何继续。

更新:我注意到 FragmentPagerAdapter 来自 support.v4 库。如果我要使用它,看起来我也必须使用 support.v4 中的 ListFragment,包括 LoaderManager。不幸的是,LoaderManager 不容易升级到 support.v4。欢迎任何想法。

【问题讨论】:

    标签: android android-viewpager android-listfragment android-cursoradapter


    【解决方案1】:

    我解决了。我会给出主要的指示。

    首先,请阅读本教程,因为给定的结构有效。 http://www.truiton.com/2013/05/android-fragmentpageradapter-example/

    其次,检查您的所有导入是否来自 support.v4 库。这意味着 FragmentActivity(上例中为 AppCompatActivity)、ListFragment、Loader、LoaderManager 和 CursorLoader。我花了很长时间试图找出代码出了什么问题,而我仍然有来自错误库的 Loader 和 CursorLoader。

    三、MainActivity是放置FragmentPagerAdapter的地方,如:

    MainActivity extends AppCompatActivity {
    static final int ITEMS = 5;  // number of lists
        ...
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            ...
            // Setting the viewpager
            mPager = (ViewPager) findViewById(R.id.pager_container_home);
            mPagerAdapter = new EntriesListPagerAdapter(getSupportFragmentManager());
            mPager.setAdapter(mPagerAdapter);
    
            ...
        }
    
        public class EntriesListPagerAdapter extends FragmentPagerAdapter {
            public EntriesListPagerAdapter(FragmentManager fragmentManager) {
                super(fragmentManager);
            }
    
            @Override
            public int getCount() {
                return ITEMS;
            }
    
            @Override
            public Fragment getItem(int position) {
                return EntriesListFragment.init(position);
            }
        }
    }
    

    第四,ListFragment 必须改变。它必须能够多次使用才能支持 ViewPager 中不同列表的数量。我会给出重要的方法/元素。

    public class EntriesListFragment extends ListFragment {
    // Loader to get the data from database for the list. Called from startLoaders();
    private final LoaderManager.LoaderCallbacks<Cursor> mEntriesLoader = new LoaderManager.LoaderCallbacks<Cursor>() {...} 
    
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Getting the page number when created
        pageViewerFragmentNum = getArguments() != null ? getArguments().getInt("val") : 1;
    
    }
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_entry_list, container, false); // orig was 'true'
        mListView = (ListView) rootView.findViewById(android.R.id.list);
        return rootView;
    }
    
    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        Log.e(TAG, "onActivityCreated");
        super.onActivityCreated(savedInstanceState);
        // Setting the adapter for each of the Feeds
        // The used feedId is the pageViewerFragmentNum + 1
    
        String FeedId = String.valueOf(pageViewerFragmentNum+1);
        mUri = EntryColumns.ENTRIES_FOR_FEED_CONTENT_URI(FeedId);
    
        // setting the adapter for the list
        mEntriesCursorAdapter = new EntriesCursorAdapter(getActivity(), mUri,
                Constants.EMPTY_CURSOR);
        setListAdapter(mEntriesCursorAdapter);
        startLoaders();
    }
    
    // Initialise the new listFragment for each Page. Notice the static!
    public static EntriesListFragment init(int positie) {
        EntriesListFragment viewPagerFragmentList = new EntriesListFragment();
        // Supply val input as an argument.
        Bundle args = new Bundle();
        args.putInt("val", positie);
        viewPagerFragmentList.setArguments(args);
        return viewPagerFragmentList;
    }
    
    private void startLoaders() { 
        LoaderManager loaderManager = getLoaderManager();
        loaderManager.restartLoader(ENTRIES_LOADER_ID, null, mEntriesLoader);
    }
    
    }
    

    请注意,上面给出的代码并不完整。前面提到的教程是,但我只是想向您展示主要成分,以帮助您入门,如果您像我一样陷入困境。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-24
      • 1970-01-01
      • 1970-01-01
      • 2014-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多