RecyclerView里嵌套ViewPager,滚动RecyclerView时,记住之前ViewPager滑动后的位置
2016-05-05 15:18
841 查看
如果是ListView里嵌套ViewPager的话,首先要考虑的是竖向滑动和横向冲突的问题,RecyclerView的话,不用考虑此问题
RcyclerView每次显示其item时,使其内部的ViewPager,按照map里保存好的信息,来显示指定位置的ViewPager的位置(RcyclerView的onBindViewHolder方法里的内实现)
每次ViewPager滑动后,要保存你滑动过的ViewPager所在的RcyclerView中的位置和你滑动ViewPager后,ViewPager所显示的内容的位置(setOnPageChangeListener的onPageSelected方法内实现)
关键代码:
全部代码:
方法:
准备一个map来存储你滑动过的ViewPager所在的RcyclerView中的位置和你滑动ViewPager后,ViewPager所显示的内容的位置RcyclerView每次显示其item时,使其内部的ViewPager,按照map里保存好的信息,来显示指定位置的ViewPager的位置(RcyclerView的onBindViewHolder方法里的内实现)
每次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); } } }
相关文章推荐
- Android性能优化典范 - 第5季
- 线程安全与可重入函数的联系与区别
- win10 JDK安装图解
- eclipse里svn的合并操作
- 缩略图预览大图并且可以左右滑动
- osx项目安装cordova开发编译环境并创建项目
- 实例讲解JavaScript的Backbone.js框架中的View视图
- MFC对话框杂记(一)
- MySQL输入错误后如何取消
- spring定时任务时间格式cronExpression设置
- 批量修改文件名
- 深入了解javascript中的exec与match方法
- SQL 中查询表是否存在,库,视图
- Struts2注解Convention扫描jar中的Action的设置
- iOS中UITextFiled只能输入数字和小数点
- LeetCode #11 Container With Most Water C# Solution
- centos7 添加硬盘和分区
- CPU MPU MCU SOC SOPC关系及区别
- 一张图看明白你的钱是怎么被庄家套走的
- 马桶维修方法