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

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

ViewHolder1 在位置 0 ViewHolder2 在位置 1

目前视野很好。

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

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

我如何做到这一点?

【问题讨论】:

    标签: android android-recyclerview custom-adapter android-viewholder


    【解决方案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 设备中创建浅拷贝不是一个好主意
      • 然后你分页。
      猜你喜欢
      • 2013-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-15
      • 1970-01-01
      • 2015-10-25
      • 2018-02-04
      相关资源
      最近更新 更多