【问题标题】:TextView inside Recyclerview ViewHolder - OnClickListnerRecyclerview ViewHolder中的TextView - OnClickListener
【发布时间】: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解决方案:)

标签: android android-recyclerview onclicklistener


【解决方案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,我没有将您标记为答案,因为您没有编写任何代码,根据 StackOverflow 规则,每当您回答时,请提供工作代码.尽管您在现场,但我无法为您标记答案。然而,我赞成你作为它或多或少的解决方案
  • 好的,我知道了,我下次试试,谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多