RecyclerView裡巢狀ViewPager,滾動RecyclerView時,記住之前ViewPager滑動後的位置
阿新 • • 發佈:2019-02-11
如果是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);
}
}
}