您的位置:首页 > 其它

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

2016-05-05 15:18 841 查看
如果是ListView里嵌套ViewPager的话,首先要考虑的是竖向滑动和横向冲突的问题,RecyclerView的话,不用考虑此问题

方法:

准备一个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);
}

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: