Recyclerview ViewHolder中的TextView - OnClickListener
Posted
技术标签:
【中文标题】Recyclerview ViewHolder中的TextView - OnClickListener【英文标题】:TextView inside Recyclerview ViewHolder - OnClickListner 【发布时间】:2021-10-24 18:07:55 【问题描述】:我有一个非常简单的RecyclerView
和一个ViewHolder
如下
ViewHolder
private class SENT_VH : RecyclerView.ViewHolder, View.IOnClickListener
public SENT_VH(View itemView) : base(itemView)
MyText = itemView.FindViewById<TextView>(Resource.Id.sent_msg_time);
DeleteButton = itemView.FindViewById<TextView>(Resource.Id.sent_msg_person_name);
itemView.SetOnClickListener(this);
public TextView DeleteButton get; set;
public TextView MyText get; set;
public void OnClick(View v)
// ViewHolder Item clicked
当我单击该项目时,这可以完美运行,但我正在尝试在 DeleteButton
上实现 OnClickListner,如下所示
public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int position)
try
SENT_VH viewHolder = holder as SENT_VH;
viewHolder.MyText.Text = itemList[position].userText;
viewHolder.DeleteButton.SetOnClickListener(new DeleteOnClickListner(itemList[position].id, context, position));
catch (Exception X)
//LOG.Error >> ERROR
我的DeleteOnClickListner
终于是
class DeleteOnClickListner : Java.Lang.Object, View.IOnClickListener
private decimal id;
private Context context;
private int pos;
public DeleteOnClickListner(decimal id, Context context, int pos)
this.id = id;
this.context = context;
this.pos = pos;
public void OnClick(View v)
android.Util.Log.Debug("ADAPTER", "Delete id: " + id);
((MainActivity)context).deleteConfirmation(id, pos);
在 deleteConfirmation
方法的 MainActivity 中,我只是想获取位置和 ID,如下所示
public void deleteConfirmation(decimal id, int pos)
EVENT_LOGGER(TAG, "Pos:" + pos + ", id: " + id);
问题是我总是得到相同的id
和position
作为我点击任何ViewHolder 的第一个DeleteButton
,它永远不会改变。
例如,如果我首先单击项目位置 10 处的 DeleteButton
,则无论我接下来单击哪个 DeleteButton
,它都会继续发送位置 10。
你们知道发生了什么吗
编辑:
按照@tyczj 的建议,我尝试通过在我的 ViewHolder 中添加以下内容来移动我的 ViewHolder 中的 OnclickListner
public void SetMyView(decimal id, Context context, int pos)
DeleteButton.SetOnClickListener(new DeleteOnClickListner(id, context, pos));
并在我的OnBindViewHolder
中使用 SetMyView 如下
public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int position)
try
SENT_VH viewHolder = holder as SENT_VH;
viewHolder.SetMyView(position, context); //This line here
viewHolder.MyText.Text = itemList[position].userText;
viewHolder.DeleteButton.SetOnClickListener(new DeleteOnClickListner(itemList[position].id, context, position));
No Difference 完全相同的结果 捕获(异常 X) //LOG.Error >> 错误
EDIT 2 - Working Solution
我更新了 VH 以添加以下内容
DeleteButton.SetOnClickListener(new DeleteOnClickListner(AdapterPosition));
【问题讨论】:
这是在 Xamarin 中吗? 是的,但是你可以给我java解决方案:) 【参考方案1】:您的第一种方法有什么问题?使用 ViewHolder 比您正在做的要容易得多
让你的viewholder成为你的adapter的内部类
Kotlin 示例
inner class ViewHolder(view: View): RecyclerView.ViewHolder(view)
val MyText : TextView = view.findViewById(R.id.sent_msg_time)
val DeleteButton : TextView = view.findViewById(R.id.sent_msg_person_name)
init
DeleteButton .setOnClickListener
((MainActivity)context).deleteConfirmation(itemList[adapterPosition].id, adapterPosition)
adapterPosition
或 absoluteAdapterPosition
取决于您使用的 recyclerview 版本,为您提供查看器的位置
为您的适配器传递上下文以获取您的主要活动(应该使用接口来与活动进行通信)和项目列表,然后您可以更轻松地获得所需的内容
【讨论】:
嘿,为回复喝彩,我同意使用interface
,但是我确实尝试了您的建议,但没有任何区别,请在我的问题中查看我的编辑,以确保我理解您的正确回答。
@Ali 我真的看不出与你所拥有的有什么不同,你只是将逻辑移到了 VH,你没有像我建议的那样使用 adapterPosition (getAdapterPosition) 或 absoluteAdapterPosition (getAbsoluteAdapterPosition())给你。您不需要向 VH 传递任何其他内容,只需创建点击侦听器即可
知道了,干杯谢谢 :) 这行得通,我还创建了界面【参考方案2】:
您可以在ViewHolder
中使用getAbsoluteAdapterPosition
来获取绝对位置
参考: getAbsoluteAdapterPosition | Android Developers
【讨论】:
嘿,感谢您的解决方案,我使用了adapterPosition
,我没有将您标记为答案,因为您没有编写任何代码,根据 *** 规则,每当您回答时,请提供工作代码.尽管您在现场,但我无法为您标记答案。然而,我赞成你作为它或多或少的解决方案
好的,我知道了,我下次试试,谢谢以上是关于Recyclerview ViewHolder中的TextView - OnClickListener的主要内容,如果未能解决你的问题,请参考以下文章
DataBinding:如何使用 Kotlin 中的泛型创建具有多个 ViewHolder(多个布局)的 Recyclerview
关于recyclerView中ViewHolder中的几种不同方式获取position有什么区别
关于recyclerView中ViewHolder中的几种不同方式获取position有什么区别
关于recyclerView中ViewHolder中的几种不同方式获取position有什么区别