【发布时间】:2018-08-08 19:10:59
【问题描述】:
当按下项目中的视图时,我想从回收站视图中删除项目。
情况:使用带有数据集的 RecyclerView 和 ViewHolder 制作列表,该列表具有 onClick 用于从列表中删除项目的视图,我需要知道单击了哪个项目在 ViewHolder 上并将其传递给 Adapter,因为 Adapter 具有数据集。在 ViewHolder 中我可以通过这个方法知道哪个项目被按下了:getAdapterPosition(),所以似乎很容易知道要删除哪个项目。
问题: ViewHolder 是 RecyclerView.Adapter 内部的一个子类,并且 Adapter 有数据集,所以我试图了解哪个是查看者与必须删除已被点击的 Item 的适配器。
最先进的技术:我可以在 Stack Overflow 中看到一些问题,其中一些是旧的,其中一些是新的,例如:Android RecyclerView addition & removal of items 但解决方案没有说明如何与必须删除项目的适配器通信。可能用户正在使用静态字段或其他东西来做这件事,但这不是实现这一目标的好方法。而且我看不到其他问题中解释的其他方式。
这是来自官方 Recycler 指南的示例,您可以在其中看到 ViewHolder 嵌套在 Adapter 内部并且无法访问它:https://developer.android.com/guide/topics/ui/layout/recyclerview.html
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
private String[] mDataset;
// Provide a reference to the views for each data item
// Complex data items may need more than one view per item, and
// you provide access to all the views for a data item in a view holder
public static class ViewHolder extends RecyclerView.ViewHolder {
// each data item is just a string in this case
public TextView mTextView;
public ViewHolder(TextView v) {
super(v);
mTextView = v;
}
}
// Provide a suitable constructor (depends on the kind of dataset)
public MyAdapter(String[] myDataset) {
mDataset = myDataset;
}
// Create new views (invoked by the layout manager)
@Override
public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
int viewType) {
// create a new view
TextView v = (TextView) LayoutInflater.from(parent.getContext())
.inflate(R.layout.my_text_view, parent, false);
...
ViewHolder vh = new ViewHolder(v);
return vh;
}
// Replace the contents of a view (invoked by the layout manager)
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
// - get element from your dataset at this position
// - replace the contents of the view with that element
holder.mTextView.setText(mDataset[position]);
}
// Return the size of your dataset (invoked by the layout manager)
@Override
public int getItemCount() {
return mDataset.length;
}
}
【问题讨论】:
-
y 没有在
onBindViewHolder(..)中设置点击,而是在那里我们将位置作为参数 -
@SantanuSur 请解释一下,我不明白你的意思
-
你可以在你的
onBindViewHolder()里面放一个onClickListener而不是你的ViewHolder类。 -
我们可以在
onBindViewHolder(ViewHolder holder, int position) { holder.setonClick(.....onClick(View view) { this.notifyItemRemoved(position); }}中设置clickListener不行吗?? -
ViewHolder 不应该进行任何通信。它是视图的查找表,是对重复调用 findViewById 的优化。它根本不应该有任何逻辑。
标签: android android-recyclerview android-viewholder