gpt4 book ai didi

android - 如何在 RecyclerView 中保留 ViewPager 状态?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:38:10 24 4
gpt4 key购买 nike

我的 RecyclerView 包含许多 ViewPagers。每个 ViewPager 中的页面数是常量 (2)。我使用 PagerAdapter。

当我滚动我的 RecyclerView 时,ViewPagers 会失去它们的状态并重置到第一页。我想知道如何为每个 ViewPager 保留最后选择的页面。

例如:1)我在第一个 ViewPager 中滚动到第 2 页2) 我将 RecyclerView 滚动到底部,我的第一个 ViewPager 离开了屏幕。3) 我滚动到 ViewPager 的顶部,所以我的第一个 ViewPager 再次加载。4) 我的第 1 个 ViewPager 设置为第 1 页,而不是我最后滚动到的第 2 页。

RecyclerView 中有“n”个 ViewPagers,我想保留它们的所有状态,无论 RecyclerView 是否重新加载。

如何解决这个逻辑?

最佳答案

好吧,我为此写了一点暴力解决方案。

我的PagerAdapter:

public class ViewPagerAdapter extends PagerAdapter {

@Override
public int getCount() {
return 2;
}

@Override
public Object instantiateItem(ViewGroup container, int position) {
FrameLayout layout = new FrameLayout(container.getContext());
FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(
FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT);
layout.setLayoutParams(layoutParams);

layout.setBackgroundColor(position % 2 == 0 ? Color.RED : Color.BLUE);
container.addView(layout);
return layout;
}

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

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

(所以我们视觉上的“状态”在颜色上有所不同——第一个位置是红色,第二个位置是蓝色)

RecyclerViewAdapter 看起来像:

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

public HashMap<Integer, Integer> viewPageStates = new HashMap<>();

public RecyclerViewAdapter() {}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
return new ViewHolder(new ViewWithViewPager(viewGroup.getContext()));
}

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
((ViewWithViewPager) holder.itemView).refreshState(position, viewPageStates.containsKey(position)? viewPageStates.get(position) : 0);
}

@Override
public int getItemCount() {
return 42;
}

@Override
public void onViewRecycled(RecyclerView.ViewHolder holder) {
ViewWithViewPager recycledViewPager = ((ViewWithViewPager)holder.itemView);
viewPageStates.put(recycledViewPager.viewPosition, recycledViewPager.viewPager.getCurrentItem());
super.onViewRecycled(holder);
}

public class ViewHolder extends RecyclerView.ViewHolder {

public ViewHolder(View itemView) {
super(itemView);
}
}
}

即每次我们绑定(bind) RecyclerViewViewHolder 时,我们都会传递 viewpager 的当前状态(来自 viewPageStates)及其在 RecyclerView 中的顺序 的数据集。一旦它被回收 - 我们读取它的当前页面状态并将其保存到 HashMap viewPageStates 中。

最后一 block - ViewWithViewPager

public class ViewWithViewPager extends FrameLayout {

ViewPager viewPager;
int viewPosition = 0;

public ViewWithViewPager(Context context) {
super(context);
LayoutInflater.from(context).inflate(R.layout.item_layout, this);
viewPager = (ViewPager) findViewById(R.id.viewPager);
viewPager.setAdapter(new ViewPagerAdapter());
}

public void refreshState(int position, int selectedPage) {
viewPosition = position;
viewPager.setCurrentItem(selectedPage);
}
}

即在 refreshState 中,我们将 ViewPager 设置为正确的页面

关于android - 如何在 RecyclerView 中保留 ViewPager 状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34274691/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com