当前位置:  开发笔记 > 编程语言 > 正文

如何在RecyclerView中保留ViewPager状态?

如何解决《如何在RecyclerView中保留ViewPager状态?》经验,为你挑选了1个好方法。

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

当我滚动我的RecyclerView时,ViewPagers会丢失其状态并重置为第1页.我想知道如何保留每个ViewPager的最后一个选定页面.

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

RecyclerView中有很多ViewPagers,我想保留所有状态,无论是否由于RecyclerView而重新加载.

如何解决这个逻辑?



1> Konstantin L..:

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

我的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 {

    public HashMap 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);
        }
    }
}   

即每次我们结合时间RecyclerViewViewHolder,我们通过viewpager的(从当前状态viewPageStates)及其顺序RecyclerView的数据集.一旦它被回收 - 我们会读取当前页面状态并将其保存到HashMap viewPageStates.

最后一块 - 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设置为正确的页面


您可以在RecyclerView中使用`public void onViewRecycled(VH holder)`方法,当适配器创建的视图被回收时,它会被调用.您可以在调用此方法时保存当前状态,不再需要ViewWithViewPager :)
推荐阅读
手机用户2502851955
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有