从 RecyclerView Adapter Android 隐藏和显示多个视图持有者

Posted

技术标签:

【中文标题】从 RecyclerView Adapter Android 隐藏和显示多个视图持有者【英文标题】:Hide and show multiple view holder from RecyclerView Adapter Android 【发布时间】:2020-07-31 13:00:40 【问题描述】:

我的自定义适配器中有两个视图持有者说

ViewHolder1 在位置 0 ViewHolder2 在位置 1

目前视野很好。

现在我在 MainActivity 中有按钮。我想用外行的话来做这样的事情

在第一次点击时,它应该在位置 0 隐藏 ViewHolder1,并且它应该向上移动 ViewHolder2。 在第二次点击时,它应该在位置 0 处查看 Viewholder1 并将 ViewHolder2 向下移动。

我如何做到这一点?

【问题讨论】:

【参考方案1】:

也许将整个项目视图的可见性更改为 GONE 或 VISIBLE 可能会有所帮助。

我不知道它是否有效,但理论上它可能有效(因为您似乎不想从数据源中删除项目)。

这只是为了让您了解您可能会做什么。

使用界面:

public interface itemVisibilityListener

void itemVisibility(int position,int visibility);

活动中:

class MyActivity extends Activity implements itemVisibilityListener

private int visible = View.VISIBLE;
private int gone = View.GONE;
private boolean firstItemVisible=true;
private MyAdapter adapter;
........

//on create
adapter.setItemVisibilityListener(this);

//when button clicked
button.setOnClickListener(new....

if(firstItemVisible)
adapter.hideItem1(true); 
else
adapter.hideItem1(false);




);



//this callback gives you feedback on visibility of first item
@override
public void itemVisibility(int position , int visibility)

button.setEnabled(true);

if(position==0 && visibility==visible)

 //item of position 0 is visible

  firstItemVisible=true;

else if(position==0 && visibility==gone)

//item of position 0 is not visible
 firstItemVisible=false;









在您的适配器中:

class MyAdapter extends .......

private int visible = View.VISIBLE;
private int gone = View.GONE;
private boolean hide = false;
private itemVisibilityListener listener;

public void hideItem1(boolean hide)

this.hide=hide;
this.notifyDataSetChanged();



public void setItemVisibilityListener(itemVisibilityListener listener)

this.listener=listener;



.........

//on bind view holder
//this is your logic for handling multiple viewholders

public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int postion)

if(holder.getItemViewType == FIRST_ITEM_TYPE)

//item 1 binding

if(hide)
holder.itemView.setVisibility(gone);
listener.itemVisibility(0,gone);

else
holder.itemView.setVisibility(visible);
listener.itemVisibility(0,visible);


else if(holder.getItemViewType == SECOND_ITEM_TYPE)

//item 2 binding......








【讨论】:

【参考方案2】:

如果您的数据以这样的列表表示,

data = mutableListOf<BaseClass>(item1, item2)

然后您可以通过更新数据并通知适配器来删除第一个视图

data.remove(0)
adapter.notifyItemRemoved(0)

然后当你想再次添加它时,你做

data.add(0, item1)
adapter.notifyItemInserted(0)

参考this。

【讨论】:

这是一种方法,但我不想删除该项目,即使我认为您的解决方案数据没有以列表的形式表示。 不管数据如何表示,这是一个例子。如果您不想从集合中移除该项目,您可以制作集合的浅表副本并将其传递给适配器,然后从该副本中移除/插入条目。 如果数据集很大,那么在 android 设备中创建浅拷贝不是一个好主意 然后你分页。

以上是关于从 RecyclerView Adapter Android 隐藏和显示多个视图持有者的主要内容,如果未能解决你的问题,请参考以下文章

如何从 RecyclerView.Adapter<CardAdapter.ViewHolder> 打开片段

RecyclerView 知识梳理 - Adapter

从 RecyclerView Adapter Android 隐藏和显示多个视图持有者

如何在 Adapter 类的 RecyclerView 中提供子项的条件可见性?

Android RecyclerView MVVM 在哪里使用 notifyDataSetChanged 更新 Adapter

RecyclerView.Adapter优化了吗?