ViewPager 中的 Recyclerviews [英] Recyclerviews in ViewPager

查看:8
本文介绍了ViewPager 中的 Recyclerviews的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在努力让这个工作:我基本上想要在一个 ViewPager 中的两个 Recyclerviews.我跟着这个教程:http://android-java-development.blogspot.de/2012/05/system.html,但它似乎不起作用.我看起来视图寻呼机是空的,回收器视图没有显示.

I'm trying to get this working: I basically want two Recyclerviews in one ViewPager. I followed this Tutorial: http://android-java-development.blogspot.de/2012/05/system.html, but it doesn't seem to work. I looks like the view pager is empty and the recycler view doesn't show up.

这是我的布局代码:

<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:

And my 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 方法:

And my onCreatView method:

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

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

Here I'm passing the cursor object to the adapter:

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

推荐答案

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

You have to extend FragmentPagerAdapter or FragmentStatePagerAdapter in order to easily embed RecyclerView. If you are going to update your ViewPager contents during its lifecycle it is strictly recommended to use FragmentStatePagerAdapter

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

You will have to create additional fragment layout, containing RecyclerView.

如果你想用 SwipeRefreshLayout 更新你的 ViewPager,不要用 SwipeRefreshLayout 包裹它.相反,您必须在片段布局中使用 SwipeRefreshLayout.

If you wish to update your ViewPager with SwipeRefreshLayout, don't wrap it with SwipeRefreshLayout. Instead, you must have SwipeRefreshLayout inside fragment layout.

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

Therefore for your fragment you may get the following xml:

<?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>

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

And create additional Fragment class, which will inflate that layout and implement methods, that you will need to update refresh indicator status.

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

A bit old example is found here: http://developer.android.com/training/implementing-navigation/lateral.html

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

If you wish to connect your ViewPager with new support library TabLayout, it is easily one with:

tabLayout.setupWithViewPager(viewPager);

最后,如果您要更新分段"ViewPager,请不要尝试重置适配器,因为片段不是通过适配器管理的,而是通过 FragmentManager 管理的.更新对应RecyclerViews

Finally, if you will update your "fragmented" ViewPager, don't try to reset the adapter, as fragments are managed not with adapter, but with FragmentManager. It is wiser to update content of corresponding 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 类必须实现 getTitle() 方法.

Your MyFragment class has to implement getTitle() method.

这篇关于ViewPager 中的 Recyclerviews的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆