Java ViewPager中的Recyclerviews

Java ViewPager中的Recyclerviews,java,android,listview,android-viewpager,android-recyclerview,Java,Android,Listview,Android Viewpager,Android Recyclerview,我正在努力让它工作:我基本上希望在一个ViewPager中有两个Recyclerviews。我遵循了本教程:,但它似乎不起作用。我看起来好像查看页面是空的,而回收器视图没有显示 这是我的布局代码: <android.support.v4.widget.SwipeRefreshLayout android:id="@+id/pager_refresh_layout" android:layout_width="match_parent" and

我正在努力让它工作:我基本上希望在一个ViewPager中有两个Recyclerviews。我遵循了本教程:,但它似乎不起作用。我看起来好像查看页面是空的,而回收器视图没有显示

这是我的布局代码:

<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>
这里我将游标对象传递给适配器:

@Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
        ((NewsAdapter) newsPagerAdapter.getAdapterForViewAtIndex(0)).swapCursor(data);
    }
@覆盖
public void onLoadFinished(加载器、光标数据){
((NewsAdapter)newsPagerAdapter.getAdapterForViewAtIndex(0)).swapCursor(数据);
}

您必须扩展
FragmentPagerAdapter
FragmentStatePagerAdapter
,以便轻松嵌入RecyclerView。如果要在ViewPager的生命周期内更新其内容,严格建议使用FragmentStatePagerAdapter

您必须创建额外的片段布局,其中包含
RecyclerView

如果要使用
SwipeRefreshLayout
更新您的
ViewPager
,请不要使用
SwipeRefreshLayout
包装它。相反,您必须在片段布局中使用
SwipeRefreshLayout

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

最后,如果要更新“碎片化”的
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();
    }
}
公共类MyFragmentedPagerAdapter扩展了FragmentStatePagerAdapter{
私人最终表格布局mTabLayout;
私有最终SwipeRefreshLayout.OnRefreshListener mRefreshListener;
私有向量碎片列表;
私人矢量标题;
公共MyFragmentedPagerAdapter(FragmentManager fm、MyComplexData数据、OnCartActionListener侦听器、TableLayout TableLayout、SwiperFreshLayout.OnRefreshListener refreshListener){
超级(fm);
mTabLayout=表格布局;
//外部刷新侦听器,将触发updateData()
mRefreshListener=refreshListener;
fragmentList=新向量();
标题=新向量();
更新数据(数据);
}
公共void updateData(MyComplexData数据){
布尔updateTabs=false;
布尔hasNewData=false;
向量newTitles=新向量();
int位置=0;
for(TabContents TabContents:data.getTabContents()){
if(tabContents.getListContents()==null)
继续;
hasNewData=true;
布尔型isNewFragment;
MyFragment片段;
试一试{
fragment=fragmentList.get(位置);
isNewFragment=false;
}捕获(阵列索引边界外异常e){
fragment=新的MyFragment();
isNewFragment=true;
}
//更新布局的数据、标题和隐藏更新指示器
fragment.setTabContents(tabContents);
add(tabContents.getName());
if(isNewFragment){
fragment.setRefreshListener(mRefreshListener);
碎片列表。添加(碎片);
}
位置++;
}
如果(!hasNewData)
返回;
//我们需要决定是否更新选项卡
如果(titles.size()!=newTitles.size()){
updateTabs=true;
}否则{
对于(位置=0;位置=0){
返回位置;
}否则{
返回位置\无;
}
}
@凌驾
public int getCount(){
返回titles.size();
}
@凌驾
公共字符序列getPageTitle(int位置){
返回fragmentList.get(position.getTitle();
}
}

您的
MyFragment
类必须实现
getTitle()
方法

在我看来,您错过了以编程方式创建的RecyclerViews的布局参数。尝试使用类似以下内容:RelativeLayout.LayoutParams=newrelativelayout.LayoutParams(LayoutParams.MATCH_PARENT,100)对于您的两个视图非常感谢您的回复!不幸的是,回收器视图似乎仍然不可见。请更新代码好吗?好的,看看适配器实现。我会做两件事,但首先让我问你一个问题。您在哪里填充这两个RecyclerViews?如我所见,将null作为NewsAdapter中的第二个参数传递(我假设它是集合)。我说得对吗?如果没有任何要渲染的项目,RecyclerView将是空的(不可见的)。我会将此标记为答案,因为这与我得出的结论相同。我只是认为不使用片段会更有效,因为所有视图都有相同的底层数据集。不管怎样,谢谢你的帮助,谢谢。我发布了这个答案,因为我找不到任何关于这个问题的答案,其他男人也会搜索这个问题,包括我自己(未来=)我已经扩展了FragmentPagerAdapter,从几天来我一直在努力寻找为什么RecyclerView不更新。在阅读了你的回复后,我已经更改了StatePageRadapter,并且成功了。。谢谢你,欢迎你。令人难以置信的是,这样一个古老的答案竟然仍然存在
@Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
        ((NewsAdapter) newsPagerAdapter.getAdapterForViewAtIndex(0)).swapCursor(data);
    }
<?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>
tabLayout.setupWithViewPager(viewPager);
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();
    }
}