1. 程式人生 > >RecyclerView裡巢狀ViewPager,滾動RecyclerView時,記住之前ViewPager滑動後的位置

RecyclerView裡巢狀ViewPager,滾動RecyclerView時,記住之前ViewPager滑動後的位置

如果是ListView裡巢狀ViewPager的話,首先要考慮的是豎向滑動和橫向衝突的問題,RecyclerView的話,不用考慮此問題

方法:

  1. 準備一個map來儲存你滑動過的ViewPager所在的RcyclerView中的位置和你滑動ViewPager後,ViewPager所顯示的內容的位置
  2. RcyclerView每次顯示其item時,使其內部的ViewPager,按照map裡儲存好的資訊,來顯示指定位置的ViewPager的位置(RcyclerView的onBindViewHolder方法裡的內實現)
  3. 每次ViewPager滑動後,要儲存你滑動過的ViewPager所在的RcyclerView中的位置和你滑動ViewPager後,ViewPager所顯示的內容的位置(setOnPageChangeListener的onPageSelected方法內實現)

關鍵程式碼:

     Map<Integer,Integer> map=new HashMap();

     @Override
        public void onBindViewHolder(final MyVH holder, int position) {
            holder.tv.setText(list.get(position));
            mPagerAdapter = new MyPagerAdapter(context, list);
            holder.viewpager.setAdapter(mPagerAdapter);

            Iterator iter = map.entrySet().iterator();
            while
(iter.hasNext()) { Map.Entry entry = (Map.Entry) iter.next(); int key = (int) entry.getKey(); int val = (int) entry.getValue(); if (position==key){ holder.viewpager.setCurrentItem(val); } } holder.viewpager.setOnPageChangeListener(new
ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { int recyclerPosition = holder.getLayoutPosition(); map.put(recyclerPosition,position); } @Override public void onPageScrollStateChanged(int state) { } }); }

全部程式碼:

package com.github.c.recycleviewhorizonalscroll;

import android.content.Context;
import android.os.Bundle;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

public class MainActivity extends AppCompatActivity {

    private RecyclerView mRecyclerView;
    private List<String> list;
    private MyAdapter mAdapter;
    Map<Integer,Integer> map=new HashMap();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        list = new ArrayList<>();
        for (int i = 0; i < 9; i++) {
            list.add("這是item" + i);
        }


        mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);
        mAdapter = new MyAdapter(this, list);
        LinearLayoutManager manager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
        mRecyclerView.setLayoutManager(manager);
        mRecyclerView.setAdapter(mAdapter);

    }


    class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyVH> {
        private Context context;
        private List<String> list;
        private MyPagerAdapter mPagerAdapter;


        public MyAdapter(Context context, List<String> list) {
            this.context = context;
            this.list = list;
        }

        @Override
        public MyVH onCreateViewHolder(ViewGroup parent, int viewType) {
            LayoutInflater inflater = LayoutInflater.from(context);
            View view = inflater.inflate(R.layout.item, parent, false);


            return new MyVH(view);
        }

        @Override
        public void onBindViewHolder(final MyVH holder, int position) {
            holder.tv.setText(list.get(position));
            mPagerAdapter = new MyPagerAdapter(context, list);
            holder.viewpager.setAdapter(mPagerAdapter);

            Iterator iter = map.entrySet().iterator();
            while (iter.hasNext()) {
                Map.Entry entry = (Map.Entry) iter.next();
                int key = (int) entry.getKey();
                int val = (int) entry.getValue();
                if (position==key){
                    holder.viewpager.setCurrentItem(val);
                }
            }

            holder.viewpager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
                @Override
                public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

                }

                @Override
                public void onPageSelected(int position) {
                    int recyclerPosition = holder.getLayoutPosition();
                    map.put(recyclerPosition,position);
                }

                @Override
                public void onPageScrollStateChanged(int state) {

                }
            });



        }

        @Override
        public int getItemCount() {
            return list.size();
        }

        class MyVH extends RecyclerView.ViewHolder {

            private TextView tv;
            private ViewPager viewpager;
            View itemView;

            public MyVH(View itemView) {
                super(itemView);
                this.itemView = itemView;
                tv = (TextView) itemView.findViewById(R.id.tv);
                viewpager = (ViewPager) itemView.findViewById(R.id.viewpager);

            }
        }
    }


    class MyPagerAdapter extends PagerAdapter {
        private Context context;
        private List<String> list;


        public MyPagerAdapter(Context context, List<String> list) {
            this.context = context;
            this.list = list;
        }

        @Override
        public Object instantiateItem(ViewGroup container, int position) {

            View view = View.inflate(context, R.layout.item_item, null);
            TextView tv_inner = (TextView) view.findViewById(R.id.tv_inner);
            tv_inner.setText(list.get(position));
            container.addView(view);
            return view;
        }

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

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

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


    }
}