web-dev-qa-db-ja.com

ViewPagerのRecyclerviews

私はこれを機能させようとしています:基本的に1つのViewPagerに2つのRecyclerviewが必要です。私はこのチュートリアルに従いました: 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);
    }
12
tobs

RecyclerViewを簡単に埋め込むには、FragmentPagerAdapterまたはFragmentStatePagerAdapterを拡張する必要があります。ライフサイクル中にViewPagerのコンテンツを更新する場合、FragmentStatePagerAdapterを使用することを強くお勧めします。

RecyclerViewを含む追加のフラグメントレイアウトを作成する必要があります。

ViewPagerSwipeRefreshLayoutで更新する場合は、SwipeRefreshLayoutでラップしないでください。代わりに、フラグメントレイアウト内にSwipeRefreshLayoutが必要です。

したがって、フラグメントについては、次の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>
_

そして、追加のフラグメントクラスを作成します。このクラスは、そのレイアウトを拡張し、メソッドを実装します。これを更新インジケーターのステータスを更新する必要があります。

ここに少し古い例があります: http://developer.Android.com/training/implementing-navigation/lateral.html

ViewPagerを新しいサポートライブラリTabLayoutに接続する場合は、次のものが簡単に使用できます。

_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クラスはgetTitle()メソッドを実装する必要があります。

13