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);
 

问题是我总是得到相同的idposition 作为我点击任何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)
        
    

adapterPositionabsoluteAdapterPosition 取决于您使用的 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有什么区别

recyclerview viewholder布局中的更改约束 - android

android 怎么在外面拿recyclerview 中viewholder的控件