ViewPager中的Recyclerviews

时间:2015-05-11 15:26:44

标签: java android listview android-viewpager android-recyclerview

我试图让这个工作:我基本上想在一个ViewPager中使用两个Recyclerviews。我遵循了这个教程:http://android-java-development.blogspot.de/2012/05/system.html,但它似乎不起作用。我看起来视图寻呼机是空的,并且回收站视图没有显示出来。

这是我的布局代码:

<android.support.v4.widget.SwipeRefreshLayout
        android:id="@+id/pager_refresh_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingTop="@dimen/tab_height">

        <android.support.v4.view.ViewPager
            android:id="@+id/pager"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@color/accent"/>
    </android.support.v4.widget.SwipeRefreshLayout>

我的PageAdapter:

public class NewsPagerAdapter extends PagerAdapter {
    private Context context;
    private Vector<RecyclerView> recyclerViewList;
    private String[] titles;

    public NewsPagerAdapter(Context context, int titlesId) {
        this.context = context;
        this.recyclerViewList = new Vector<>();

        setTitles(titlesId);
    }

    public void add(RecyclerView recyclerView) {
        recyclerViewList.add(recyclerView);
    }

    public RecyclerView.Adapter getAdapterForViewAtIndex(int index) {
        return recyclerViewList.get(index).getAdapter();
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        container.addView(recyclerViewList.get(position),
                new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 100)
        );
        return container;
    }

    @Override
    public int getCount() {
        return recyclerViewList.size();
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view.equals(object);
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        container.removeView((View) object);
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return titles[position];
    }

    public void setTitles(int titles) {
        this.titles = context.getResources().getStringArray(titles);
    }
}

我的onCreatView方法:

GridLayoutManager layoutManager1 = new GridLayoutManager(getActivity(), getResources().getInteger(R.integer.news_column_count));

GridLayoutManager layoutManager2 = new GridLayoutManager(getActivity(), getResources().getInteger(R.integer.news_column_count));

RecyclerView listView1 = new RecyclerView(getActivity());
RecyclerView listView2 = new RecyclerView(getActivity());
listView1.setLayoutManager(layoutManager1);
listView2.setLayoutManager(layoutManager2);

NewsAdapter adapter1 = new NewsAdapter(getActivity(), null);
NewsAdapter adapter2 = new NewsAdapter(getActivity(), null);
adapter1.setOnItemClickListener(this);
adapter2.setOnItemClickListener(this);

listView1.setAdapter(adapter1);
listView2.setAdapter(adapter2);

newsPagerAdapter.add(listView1);
newsPagerAdapter.add(listView2);

newsViewPager.setAdapter(newsPagerAdapter);

这里我将游标对象传递给适配器:

@Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
        ((NewsAdapter) newsPagerAdapter.getAdapterForViewAtIndex(0)).swapCursor(data);
    }

1 个答案:

答案 0 :(得分:12)

您必须扩展QUrl url("fftp://f13-preview.125mb.com/repo/test.txt"); if(url.isValid()) { url.setHost("f13-preview.125mb.com"); url.setUserName("1896230"); url.setPassword("mypassword"); url.setScheme("ftp"); url.setPort(21); } FragmentPagerAdapter才能轻松嵌入RecyclerView。如果您要在其生命周期内更新ViewPager内容,则严格建议使用 FragmentStatePagerAdapter

您必须创建包含FragmentStatePagerAdapter的其他片段布局。

如果您希望使用RecyclerView更新ViewPager,请不要使用SwipeRefreshLayout对其进行更新。相反,您必须在片段布局中具有SwipeRefreshLayout

因此,对于您的片段,您可能会获得以下xml:

SwipeRefreshLayout

创建额外的Fragment类,这将扩展该布局并实现方法,您需要更新刷新指示器状态。

这里有一个老例子: http://developer.android.com/training/implementing-navigation/lateral.html

如果您希望将ViewPager与新的支持库TabLayout连接起来,那么很容易将其与:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/listRefresh"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <android.support.v7.widget.RecyclerView
        android:id="@+id/categoryList"
        android:scrollbars="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</android.support.v4.widget.SwipeRefreshLayout>

最后,如果你要更新你的&#34;支离破碎的&#34; tabLayout.setupWithViewPager(viewPager); ,请勿尝试重置适配器,因为片段不是使用适配器管理,而是使用ViewPager进行管理。更新相应FragmentManager

的内容比较明智
RecyclerViews

您的public class MyFragmentedPagerAdapter extends FragmentStatePagerAdapter { private final TabLayout mTabLayout; private final SwipeRefreshLayout.OnRefreshListener mRefreshListener; private Vector<PriceListFragment> fragmentList; private Vector<String> titles; public MyFragmentedPagerAdapter(FragmentManager fm, MyComplexData data, OnCartActionListener listener, TabLayout tabLayout, SwipeRefreshLayout.OnRefreshListener refreshListener) { super(fm); mTabLayout = tabLayout; // external refresh listener, that will trigger an updateData() mRefreshListener = refreshListener; fragmentList = new Vector<>(); titles = new Vector<>(); updateData(data); } public void updateData(MyComplexData data) { boolean updateTabs = false; boolean hasNewData = false; Vector<String> newTitles = new Vector<>(); int position = 0; for(TabContents tabContents : data.getTabContents()) { if(tabContents.getListContents() == null) continue; hasNewData = true; boolean isNewFragment; MyFragment fragment; try { fragment = fragmentList.get(position); isNewFragment = false; } catch (ArrayIndexOutOfBoundsException e) { fragment = new MyFragment(); isNewFragment = true; } // Update the data, title and hide update indicator of SwipeRefreshLayout fragment.setTabContents(tabContents); newTitles.add(tabContents.getName()); if(isNewFragment) { fragment.setRefreshListener(mRefreshListener); fragmentList.add(fragment); } position++; } if(!hasNewData) return; // we need to decide, whether to update tabs if(titles.size() != newTitles.size()) { updateTabs = true; } else { for(position = 0; position < titles.size(); position++) { if(!titles.get(position).equals(newTitles.get(position))) { updateTabs = true; break; } } } titles = newTitles; notifyDataSetChanged(); if(updateTabs) mTabLayout.setTabsFromPagerAdapter(this); } @Override public Fragment getItem(int position) { return fragmentList.get(position); } // You need to override this method as well @Override public int getItemPosition(Object object) { MyFragment fragment = (MyFragment) object; String title = (String) fragment.getTitle(); int position = titles.indexOf(title); if (position >= 0) { return position; } else { return POSITION_NONE; } } @Override public int getCount() { return titles.size(); } @Override public CharSequence getPageTitle(int position) { return fragmentList.get(position).getTitle(); } } 课程必须实施MyFragment方法。