1

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

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

我有我连接viewpagerAdapter

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)获取其数据的MainActivity。这是一个长课,所以我给一些部分给你一个想法。

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); 

    } 

你能帮助我如何创建listfragment(用的CursorAdapter)的五个实例,并将其连接到ViewPager在MainActivity?任何暗示如何继续是值得欢迎的。

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

回答

0

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

首先,阅读本教程,因为给定的结构有效。 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); 
} 

} 

请注意,上面给出的代码是不完整的。前面提到的教程是,但我只是试图向你展示如果你像我一样卡住了这个问题,那么让你开始的主要内容。