从 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 Android 隐藏和显示多个视图持有者
如何在 Adapter 类的 RecyclerView 中提供子项的条件可见性?
Android RecyclerView MVVM 在哪里使用 notifyDataSetChanged 更新 Adapter