【问题标题】:How to keep Recyclerview items at same position?如何将 Recyclerview 项目保持在同一位置?
【发布时间】:2016-07-15 01:01:22
【问题描述】:

我有以下问题。我从我的 Fragment 类中填充了一个 Recyclerview。到目前为止一切正常。但是,当我测试我的应用程序并上下滚动填充的回收器列表时,每个项目的内容都会更改,也就是它们会被回收......

如何保存每个项目的位置并在滚动后将其内容恢复到相同的位置?

有什么建议吗?

【问题讨论】:

  • 显示您的适配器代码。
  • 您需要向我们展示您对 recyclerview 的实施。
  • 首先我初始化recyclerview
  • 然后调用 setLayoutManager(new LinearLayoutManager(getActivity()));
  • 最后调用 setLayoutManager(new LinearLayoutManager(getActivity()));

标签: android android-recyclerview


【解决方案1】:

好问题,这是你的答案holder.setIsRecyclable(false)

@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

    LayoutInflater inflater = (LayoutInflater) parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View view = inflater.inflate(R.layout.product_recycle_buyer_list_item, parent, false);
    MyViewHolder holder = new MyViewHolder(view);

    holder.setIsRecyclable(false);

    return holder;
}

【讨论】:

  • 供任何打算使用的人使用。请注意,这会将您的 RecyclerView 转换为 ListeView。我的意思是你的视图回收能力已经消失了。 RecyclerView 的全部意义在于具有“可回收性”,而您只是用holder.setIsRecyclable(false) 破坏了所有结构 :))
【解决方案2】:

执行此操作 holder.setIsRecyclable(false); 会将您的 RecyclerView 转换为 ListView

改为这样做

只需在 RecyclerAdapter 中覆盖这两个方法

  @Override
    public int getItemViewType(int position) {
        return position;
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

【讨论】:

    【解决方案3】:

    setIsRecyclable(false) 是一个糟糕的解决方案,因为它会在您滚动时创建越来越多的视图,这会破坏使用 RecyclerView 的全部意义。它不仅需要更多的 CPU,而且您滚动和查看新项目的次数越多,它将使用的内存就越多。如果您显示位图,情况会更糟,因为位图往往会占用大量内存。

    您应该做的是实现onBindViewHolder 将视图绑定到它应该拥有的数据。在使用位图的情况下也使用缓存。

    您可以查看我制作的示例代码 here,它询问了我想解决的不同问题。

    【讨论】:

      【解决方案4】:

      如果有人遇到这种情况,holder.setIsRecyclable(false) 会这样做,但是它只会使回收者视图成为列表视图,并且还会消耗更多资源。覆盖 getItemViewTypegetItemId 应该可以解决它。

      【讨论】:

        【解决方案5】:

        如果我正确理解了这个问题,当您调用 set adapter 时,您不想在上方滚动。 我发现最好的方法是打电话

        YourRcv.swapAdapter(YourAdapter, Bolean removeAndRecycleExistingViews); // true if yes false if no
        

        我在 androidx.recyclerview.widget 类 RecyclerView.java 的第 1142 行找到了这个方法

        【讨论】:

          猜你喜欢
          • 2022-12-15
          • 2015-09-20
          • 2014-05-25
          • 2011-11-08
          • 2017-10-23
          • 1970-01-01
          • 2021-06-19
          • 1970-01-01
          相关资源
          最近更新 更多