繁体   English   中英

从RecyclerView中删除与列表不相关的视图

[英]Remove view which is not associated with List from RecyclerView

我有2种项目类型的RecyclerViewAdapter ArrayList所有HeaderViewHolder ItemViewHolder ,一个headerView的HeaderViewHolder。 我可以从ArrayList删除项目,然后使用notifyItemRemoved(position)以便从RecyclerView删除notifyItemRemoved(position) 但是,如何删除与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;
    }

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

您说isPositionHeader(pos -> pos == 0)表示列表的第一项是标题视图,然后告诉适配器列表中包含mValues.size() + 1项。 +1弥补第一位的标头。

那么如何再次删除该视图?


如果要打开/关闭它...您需要一些可以在状态之间切换的东西。 为什么不使用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()即可将更改的值通知适配器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM