我知道。
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!
答案 0 :(得分:1)
我的列表必须是静态好的
您无需将数据集列表设为静态。如果你这样做,在某些情况下会出错。
但仍然无法在内部onClick();
中使用notifyDataSetChanged()
您不需要或不应该这样做。
让我解释一下。 ViewHolder的工作是在行布局中保留单个项目,以避免每次.See this video for more detailed explanation为findViewById()
查找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;