从 RecyclerView 中删除与 List 无关的视图

Posted

技术标签:

【中文标题】从 RecyclerView 中删除与 List 无关的视图【英文标题】:Remove view which is not associated with List from RecyclerView 【发布时间】:2017-03-19 12:54:40 【问题描述】:

我有 RecyclerViewAdapter 有 2 个项目类型。 ItemViewHolder 用于ArrayList 中的所有 itemViews,HeaderViewHolder 用于一个 headerView。我可以从ArrayList 中删除项目,然后使用notifyItemRemoved(position) 以便从RecyclerView 中删除 itemView。但是如何删除与ArrayList 无关的headerView?

下面是来自RecyclerViewAdapter的一些代码:

private static final int TYPE_HEADER = 0;
private static final int TYPE_ITEM = 1;
private List<Offer> mValues;
OfferListAdapter(List<String> items) 
        mValues = items;
    

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) 
        if (viewType == TYPE_ITEM) 
            View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.itemView, parent, false);
            return new ItemViewHolder(v);
         else if (viewType == TYPE_HEADER) 
            View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.headerView, parent, false);
            return new HeaderViewHolder(v);
        
        return null;
    

    @Override
    public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) 
        if (holder instanceof ItemViewHolder) 
            ItemViewHolder userViewHolder = (ItemViewHolder) holder;
         else if (holder instanceof HeaderViewHolder) 
             HeaderViewHolder headerViewHolder= (HeaderViewHolder) holder;
        
    

    @Override
    public int getItemViewType(int position) 
        if (isPositionHeader(position))
            return TYPE_HEADER;

        return TYPE_ITEM;
    

    private boolean isPositionHeader(int position) 
        return position == 0;
    

    private Offer getItem(int position) 
        return mValues.get(position - 1);
    

    @Override
    public int getItemCount() 
        return mValues.size() + 1;
    

【问题讨论】:

【参考方案1】:

HeaderView 列表的一部分,至少从适配器的角度来看是这样。

您说isPositionHeader(pos -&gt; pos == 0) 表示列表的第一项是标题视图,并告诉适配器您的列表中有mValues.size() + 1 项。 +1 弥补了先出现的header。

那么你怎么能再次删除这个视图呢?


如果你想打开/关闭它……你需要一些可以在状态之间切换的东西。为什么不使用boolean?您可以有一些 isShowingHeader 字段来指示是否显示标题。

这将如何影响您的代码?嗯……和上面一样的代码……

// if we show the header, the 0 position is the header
isPositionHeader(pos -> isShowingHeader && pos == 0)

对于您的列表大小...

// list is longer by 1 when showing a header
mValues.size() + (isShowingHeader ? 1 : 0)

当显示/隐藏您的标题时,您现在只需更新isShowingHeader 并调用notifyDataSetChanged() 以通知适配器您更改的值。

【讨论】:

你又让我开心了

以上是关于从 RecyclerView 中删除与 List 无关的视图的主要内容,如果未能解决你的问题,请参考以下文章

从 RecyclerView 中删除房间条目

从 recyclerview 中删除空格

如何从 recyclerview 和 sqlite 中删除项目? [复制]

如何在 Android Studio 中同时从 recyclerview 和数据库中删除数据? [关闭]

java 从recyclerview中删除项目

Android Kotlin:如何从 recyclerview 中成功删除项目、调用 notifyItemRangeChanged() 和动画