android - 如何从 ViewHolder 中删除一行回收站视图
问题描述
感谢停下来。
不久前有人向我解释说您不应该将数据存储在 中ViewHolder
,我明白为什么。但随后它使一些事情变得复杂。
如果用户单击行内的一个,我想删除一个button
行。所以我需要访问adapter
。但我无法将其存储在ViewHolder
. 什么办法?
我也在寻找recyclerview
你知道的最好的文章,因为看起来人们不知道在大多数堆栈溢出中他们在谈论什么并给出不好的建议(将数据存储在里面ViewHolder
)
编辑:我正在尝试一种解决方案,但是当我在适配器中时,getTag 返回 null
这是我的物品和装订:
public final class ItemViewMail extends RecyclerView.ViewHolder {
private AppCompatImageButton cancelButton;
public ItemViewMail(View itemView) {
super(itemView);
this.cancelButton = itemView.findViewById(R.id.profile_item_edit_email_cancel_image_button);
}
public void bind(Data data, View.OnClickListener deleteOnClickListener) {
this.itemView.setTag(data);
if (cancelButton != null) {
cancelButton.setOnClickListener(deleteOnClickListener);
}
}
}
我的适配器:
private ArrayList<Data> rowDataArrayList;
MyPVPViewAdapter(ArrayList<Data> rowDataArrayList) {
this.rowDataArrayList = rowDataArrayList;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int itemType) {
return new ItemViewMail(LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.profile_item_edit_email, viewGroup ,false));
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder myViewHolder, int position) {
((ItemViewMail) myViewHolder).bind((Data) rowDataArrayList.get(position).getData(), onClickListener);
}
@Override
public int getItemViewType(int position) {
return rowDataArrayList.get(position).getType();
}
@Override
public int getItemCount() {
return rowDataArrayList.size();
}
View.OnClickListener onClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
Data data = (Data) v.getTag();
}
};
}
解决方案
data class MyItem(val name: String)
class MyViewHolder(itemView: View,
private val onRemoveClickListener: View.OnClickListener) : RecyclerView.ViewHolder(itemView) {
fun bind(item: MyItem) {
itemView.setOnClickListener(onRemoveClickListener)
itemView.setTag(item)
//todo: eg. itemView.name.setText(item.name)
}
}
class MyRecyclerViewAdapter(private val onRemoveClickListener: View.OnClickListener): RecyclerView.Adapter<MyViewHolder>() {
var items = listOf<MyItem>()
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.viewholder_my)
return MyViewHolder(view, onRemoveClickListener)
}
override fun getItemCount(): Int {
return items.size
}
override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
holder.bind(items[position])
}
}
现在您可以在您的活动/片段/等中创建 MyRecyclerViewAdapter 并将 onClickListener 作为参数。
class MyActivity: AppCompatActivity() {
private lateinit var adapter: MyRecyclerViewAdapter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
adapter = MyRecyclerViewAdapter(View.OnClickListener { view ->
val clickedItem = view.getTag() as MyItem
adapter.items.remove(clickedItem)
adapter.notifyDataSetChanged()
})
}
}
推荐阅读
- django - Django Child模板未加载表单
- sql - 有没有办法找出 SQL Server 中两个时间范围的重叠?
- spring - Javax 验证不适用于引导休息控制器参数
- php - constraint() 和 reference() / Laravel 6 之间的区别
- python - Pyhon 检查列表中的所有项目是否都可以是数字
- julia - 用返回多个值的函数的矢量化调用替换 for 循环
- reactjs - setState 不会重新渲染反应功能组件
- c++ - 读取未知字符类型的文件
- python - 即使看起来正确也无法创建表面
- javascript - 我想打印从 0 到 1000 的“i”值