静态ViewHolder模式。那么这个静态Viewholder中的onClick模式是什么?

时间:2016-09-28 18:57:26

标签: java android performance design-patterns android-recyclerview

我知道。

0x00000000

静态ViewHolder推荐。

也是ViewHolder构造函数中的onClick(),而不是onBind()方法。

 public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener

但是知道我们在静态ViewHolder类中有内部onClick()

public ViewHolder(View v){
        super(v);
        v.setOnClickListener(this);
    }

现在是我提出所有这些建议之后的问题。

现在是什么建议,例如我想从这个回收站和notifi适配器中的列表中删除项目。

我的清单必须是静态好的.. 但仍然无法在内部onClick();

中使用notifyDataSetChanged()

对此有何建议?图案?或有用的例子会很棒。 或者你如何在你的项目中这样做。

THX!

1 个答案:

答案 0 :(得分:1)

  

我的列表必须是静态好的

您无需将数据集列表设为静态。如果你这样做,在某些情况下会出错。

  

但仍然无法在内部onClick();

中使用notifyDataSetChanged()

您不需要或不应该这样做。

让我解释一下。 ViewHolder的工作是在行布局中保留单个项目,以避免每次.See this video for more detailed explanationfindViewById()查找public interface ItemClickListener<T>{ void onItemClick(int position, T item) }

您应该做的是为适配器提供回调或侦听器,并将适配器内发生的数据更改的所有权转移到您的活动中。

例如。让我们像这样点一个简单的项目点击监听器:

public class MyAdapter extends ...{
  ...
  ...
  private ItemClickListener<MyItemModel> clickListener;

  public void setItemClickListener(ItemClickListener<MyItemModel> clickListener{
    this.clickListener = clickListener;
  } 

}

现在,在适配器中,创建对该接口的引用并提供如下的setter:

findViewById()

现在,您需要在ViewHolder中执行的操作是将click事件发送到您的自定义侦听器,如下所示: 您的ViewHolder不需要是静态的。静态内部类很好,因为它们不会引用外部类。 ViewHolder的目的是绑定单个视图并指定其实例的标记,以便稍后在滚动时进行查看,而不进行 public class ViewHolder extends ...{ ... ... @Override public void onClick(View v) { Log.d(TAG, "position = " + getAdapterPosition()); if(clickListener!=null){ clickListener.onItemClick(position , myList.get(position)) } } }

public class MyActivity extends  Activity implements ItemClickListener<MyItemModel>{

  ....
  ...
  myAdapter = new MyAdapter(myList);
  myAdapter.setItemClickListener(this);

  ...
  ...

  @Override
  public void onItemClick(int position,MyItemModel item) 
    myAdapter.myList.manipulateDataOrWhaever();
    myAdapter.notifyDataSetChanged();
  }
}

因此,您可以在用户点击,操纵数据并通知活动中的适配器时访问您的项目和位置,如下所示:

ViewHolder

如果要保持onBindViewHolder()静态,以避免对外部类的隐式引用。您可以在....onBindViewHolder() { holder.itemView.setOnClickListener(){ ....//same as click listener on ViewHolder } } 内注册点击监听器,如下所示:

.nav-md .container.body .col-md-3.left_col {
    display: none;