【问题标题】:How to use `notifyItemremoved` in `firebaserecycleradapter`?如何在`firebaserecycleradapter`中使用`notifyItemremoved`?
【发布时间】:2019-03-17 17:01:50
【问题描述】:

我正在使用 firebase-ui 从 firebase 检索我的数据。如果status 等于"unlive",我想要做的是从我的recyclerview 中删除它。我已经在互联网上搜索了几天,但找不到解决方案。

mAdapter = new FirebaseRecyclerAdapter<Hotels_Model, Adapter_HotelsHolder>(mOptions) {
        @Override
        protected void onBindViewHolder(Adapter_HotelsHolder holder,int position, Hotels_Model model) {

            String status = model.getStatus();
            if (status.equals("unlive")) {
                mAdapter.notifyItemRemoved(holder.getAdapterPosition());
            }
         mAdapter.notifyDataSetChanged();                                                             
    }

【问题讨论】:

    标签: android firebase firebase-realtime-database android-recyclerview firebaseui


    【解决方案1】:

    首先,同时调用notifyItemRemovednotifyDataSetChanged 是没有意义的。他们实现了相似的目标,因此您需要调用其中一个。 notifyDataSetChanged 告诉适配器应该重新绑定每个视图,并且布局将发生,就像您刚刚将适配器附加到 RecyclerView 一样。 notifyItemRemoved 通知适配器特定索引处的项目已被删除。这允许适配器执行相关动画以动画化移除。如果您有权访问 Hotels_Model 的基础列表,则应从集合中删除所有 "unlive" 模型。然后您可以致电notifyItemRemoved 提供相关职位。如果有很多移除,您可以使用notifyItemRangeRemovedDiffUtil 为您计算所有必要的移除并将其传递给适配器。

    这是一个使用 DiffUtil 向适配器分派更新的示例适配器:

    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import androidx.recyclerview.widget.DiffUtil;
    import androidx.recyclerview.widget.RecyclerView;
    
    class Adapter extends RecyclerView.Adapter<ViewHolder> {
    
      public void updatePaths(List<String> oldPaths, List<String> newPaths) {
        DiffResult diffResult = DiffUtil.calculateDiff(new DiffCallback(oldPaths, newPaths));
        diffResult.dispatchUpdatesTo(this);
      }
    
      class DiffCallback extends DiffUtil.Callback {
        private List<String> oldPaths;
        private List<String> newPaths;
    
        DiffCallback(List<String> oldPaths, List<String> newPaths) {
          this.oldPaths = oldPaths;
          this.newPaths = newPaths;
        }
    
        @Override public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
          return oldPaths.get(oldItemPosition).equals(newPaths.get(newItemPosition);
        }
    
        @Override public int getOldListSize() {return oldPaths.size;}
    
        @Override public int getNewListSize() {return newPaths.size;}
    
        @Override public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
          return oldPaths.get(oldItemPosition).equals(newPaths.get(newItemPosition));
        }
    
      }
    }
    

    如果计算差异需要很长时间(即列表非常大),您需要在后台线程上计算差异并将结果发送回主线程。

    关于样式的旁注,我建议不要在类名中使用下划线,而只使用 CamelCase。类名中的下划线违反约定。

    【讨论】:

    • 任何使用java的代码?抱歉,我只是一个初学者,无法理解 kotlin 代码。谢谢
    • 更新示例以使用 Java 而不是 Kotlin。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多