RecyclerView里嵌套ViewPager,滚动RecyclerView时,记住之前ViewPager滑动后的位置

本文介绍了解决在ListView或RecyclerView中嵌套使用ViewPager时出现的滑动冲突问题的方法。通过使用一个Map来记录ViewPager在RecyclerView中的位置及其当前页面,确保了在滑动时能够正确显示上一次的状态。

如果是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);
        }


    }
}
介绍:一个基于RecyclerView实现的ViewPager,支持类似于gallary的fling操作。点击上面"下载源码" 按钮,可以下载完整的demo。其中recyclerviewandroid-support中的依赖项目,RecyclerViewPager是主项目。运行效果:使用说明:继承自 RecyclerView.自定义 fling factor.自定义 paging trigger.支持 水平个垂直方向.支持 FragmentViewPager (api 12 )gradlecompile('com.lsjwzh:recyclerviewpager:1.0.2')xml:java:final RecyclerViewPager mRecyclerView = (RecyclerViewPager) this.findViewById(R.id.recyclerViewPager); LinearLayoutManager layout = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL,false);//LinearLayoutManager.HORIZONTAL 设置水平滚动 mRecyclerView.setLayoutManager(layout); //set adapter mRecyclerView.setAdapter(new MyRecyclerAdapter());static class MyRecyclerAdapter extends RecyclerView.Adapter { private List items = new ArrayList(); public MyRecyclerAdapter(){ //创建4个页面 for(int i = 1; i<5; i ){ items.add("页面" i); } } public static class ViewHolder extends RecyclerView.ViewHolder{ public ViewHolder(View itemView) { super(itemView); } } @Override public int getItemCount() { // TODO Auto-generated method stub return items.size(); } @Override public void onBindViewHolder(ViewHolder holder, int position) { String item = items.get(position); TextView msgTv = (TextView)holder.itemView.findViewById(R.id.msg); msgTv.setText(item); } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if(inflate == null) inflate = (LayoutInflater) parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); View v = (LinearLayout)(inflate.inflate(R.layout.item, null)); return new 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值