从 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 -> 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 和 sqlite 中删除项目? [复制]
如何在 Android Studio 中同时从 recyclerview 和数据库中删除数据? [关闭]
Android Kotlin:如何从 recyclerview 中成功删除项目、调用 notifyItemRangeChanged() 和动画