RecyclerView ItemClickListener 在 OnBindViewHolder 中不起作用

Posted

技术标签:

【中文标题】RecyclerView ItemClickListener 在 OnBindViewHolder 中不起作用【英文标题】:RecyclerView ItemClickListener is not working in OnBindViewHolder 【发布时间】:2021-05-23 04:32:31 【问题描述】:

在 RecyclerView 中单击时如何获取特定文本视图的 getText(string) ? 我在 OnBindViewHolder 中尝试过像 holder.itemview.setOnclickListener 一样,但我在日志中没有看到任何内容。

我得到了解决方案,但它只适用于双击。单击任何解决方案???

请检查下面我的适配器类代码

public class AddressAdapter extends FirestoreRecyclerAdapter<AddressModel, AddressAdapter.viewHolder> 
    

    public AddressAdapter(@NonNull FirestoreRecyclerOptions<AddressModel> options) 
        super(options);
    


    @Override
    protected void onBindViewHolder(@NonNull viewHolder holder, final int position, @NonNull final AddressModel model) 
        holder.name.setText(model.getName());
        holder.locationID.setText(String.valueOf(holder.getAdapterPosition()+1) );
        holder.address.setText(model.getAddress());
        holder.address.setMovementMethod(new ScrollingMovementMethod());
        holder.name.setPaintFlags(holder.name.getPaintFlags() |  Paint.UNDERLINE_TEXT_FLAG);
   
         //Guys this is not works in single click only works in double click
        holder.imgDeleteLoc.setOnClickListener(v -> 
Toast.makeText(v.getContext(), "clicked", Toast.LENGTH_SHORT).show();
         
            Log.d("cl",holder.getText().toString());
        );
    

    @NonNull
    @Override
    public viewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) 
        View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.saved_locations, parent, false);
        return new viewHolder(view);
    


    class viewHolder extends RecyclerView.ViewHolder 
         TextView locationID,name,address;
        ImageView imgDeleteLoc;

        public viewHolder(@NonNull View itemView) 
            super(itemView);
            locationID=itemView.findViewById(R.id.tvAddressIdCounter);
            name=itemView.findViewById(R.id.tvName);
            address=itemView.findViewById(R.id.tvAddress);
            imgDeleteLoc=itemView.findViewById(R.id.imgDeleteLoc);
           
        
    

下面是我的 Inflator XML

<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/cv"
    style="@style/CustomCardViewStyleTop"
    android:layout_
    android:layout_
    android:layout_margin="10dp"
    app:cardCornerRadius="10dp">

    <!-- Insert UI elements -->

    <TextView
        android:id="@+id/tvAddress"
        android:layout_
        android:layout_
        android:layout_gravity="center|top"
        android:layout_marginTop="90dp"
        android:layout_marginBottom="10dp"
        android:gravity="center"
        android:scrollbars="vertical"
        android:text="#2/22 Nainiyappan Garden 3rd Lane Old Washermenpet Chennai -600021"
        android:textColor="#77959292" />

    <TextView
        android:id="@+id/tvAddressIdCounter"
        android:layout_
        android:layout_
        android:layout_marginLeft="20dp"
        android:layout_marginTop="25dp"
        android:text="1"
        android:textColor="#000000"
        android:textSize="18sp" />

    <View
        android:layout_
        android:layout_
        android:layout_marginLeft="50dp"
        android:layout_marginTop="5dp"
        android:background="@android:color/darker_gray" />

    <TextView
        android:id="@+id/tvName"
        android:layout_
        android:layout_
        android:layout_gravity="center|top"
        android:layout_marginTop="70dp"
        android:text="Shaik"
        android:textColor="#77959292"
        android:textStyle="bold|italic" />

    <View
        android:id="@+id/view3"
        android:layout_
        android:layout_
        android:layout_marginLeft="10dp"
        android:layout_marginTop="65dp"
        android:layout_marginRight="10dp"
        android:background="@android:color/darker_gray" />

    <TextView
        android:id="@+id/textView"
        android:layout_
        android:layout_
        android:layout_marginLeft="60dp"
        android:layout_marginTop="15dp"
        android:text="Saved Locations"
        android:textColor="@color/black"
        android:textColorHighlight="#FFFFFF"
        android:textSize="18sp" />

    <ImageView
        android:id="@+id/imgDeleteLoc"
        android:clickable="true"
        android:layout_
        android:layout_
        android:src="@drawable/ic_baseline_delete_24"
        android:layout_gravity="end"
        android:layout_marginEnd="15dp"
        android:layout_marginTop="15dp"/>
    <LinearLayout
        android:layout_
        android:layout_>

    </LinearLayout>


</androidx.cardview.widget.CardView>

请任何人在点击 recyclerview 时帮助获取特定的 textview 内容。

【问题讨论】:

分享你的布局文件saved_locations 是的,请检查 【参考方案1】:

你只需要打电话

holder.imgDeleteLoc.setOnClickListener(v -> 
        Log.d("cl",holder.address.getText().toString());
    );

【讨论】:

嗯我试过了,但即使我没有看到任何吐司或日志,它仍然无法正常工作 嘿,它可以工作,但不能在单击时工作,它可以通过双击工作,任何解决方案?【参考方案2】:

您不应该再次使用 findViewById,您可以尝试通过以下任一方式获取文本:

holder.address.getText() model.getAddress()

【讨论】:

好的,我试过了,它可以工作,但双击不是单击【参考方案3】:

首先在这里更新我的代码:

class viewHolder extends RecyclerView.ViewHolder 
         TextView locationID,name,address;
        ImageView imgDeleteLoc;

        public viewHolder(@NonNull View itemView) 
            super(itemView);
            locationID=itemView.findViewById(R.id.tvAddressIdCounter);
            name=itemView.findViewById(R.id.tvName);
            address=itemView.findViewById(R.id.tvAddress);
            imgDeleteLoc=itemView.findViewById(R.id.imgDeleteLoc);
        
    

试试这个:

String getAddress = holder.address.getText().toString();

【讨论】:

是的,但不能通过单击来工作【参考方案4】:

如下更新ImageView或者你可以使用ImageButton

<ImageView
        android:id="@+id/imgDeleteLoc"
        android:clickable="true"
        android:layout_
        android:layout_
        android:clickable="true"
        android:focusable="true"
        android:src="@drawable/ic_baseline_delete_24"
        android:layout_gravity="end"
        android:layout_marginEnd="15dp"
        android:layout_marginTop="15dp"/>

【讨论】:

@BeginnerDev 尝试大一点的尺寸,比如说 50dp 的高度和宽度

以上是关于RecyclerView ItemClickListener 在 OnBindViewHolder 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

RecyclerView详解

RecyclerView

RecyclerView嵌套RecyclerView问题

RecyclerView小结

RecyclerView系列:RecyclerView嵌套RecyclerView(BaseRecyclerViewAdapterHelper实现)

recyclerview怎么监听滑动事件