从 RecyclerView 单击 TextView 不起作用,单击 Button 可以

Click on TextView from RecyclerView does not work, click on Button does

现在我的 RecyclerView 可以工作了,我可以在我的 Activity 和我的适配器之间进行通信,我想创建一个 OnClickListener,我成功地做到了。

但不知何故,它只适用于按钮,不适用于其他项目。

在我的 RecyclerView 布局中,我有以下内容:

    <TextView
        android:id="@+id/tvWebsite"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:clickable="true"
        android:singleLine="true"
        android:text="tvWebsite" />

        <Button
            android:id="@+id/btnWebsite"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Button" />

所以 TextView 是可点击的。按钮也是,但这是默认行为。

在我的适配器 class 中,我有以下内容:

public class CompanyAdapter extends RecyclerView.Adapter<CompanyAdapter.ViewHolder>
{

    private Context mContext;
    private ArrayList<Company> companyname;

    public CompanyAdapter (Context context, ArrayList<Company> list)
    {
        this.mContext = context;
        companyname = list;
    }

    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener
    {
        TextView tvCompanyName;
        TextView tvVatID;
        TextView tvPostalCode;
        TextView tvPhoneNumber;
        TextView tvProprietorName;
        TextView tvWebsite;
        TextView tvEmail;
        TextView tvFirstAvailableDate;
        TextView tvFirstAvailableTimeBlock;
        TextView tvAvailableInPostalCode;
        TextView tvAvailableNumberOfPersons;
        Button btnWebsite;




        public ViewHolder(@NonNull final View itemView)
        {
            super(itemView);

            tvCompanyName = itemView.findViewById(R.id.tvCompanyName);
            tvVatID = itemView.findViewById(R.id.tvVatNo);
            tvPostalCode = itemView.findViewById(R.id.tvPostalCode);
            tvPhoneNumber = itemView.findViewById(R.id.tvPhoneNumber);
            tvProprietorName = itemView.findViewById(R.id.tvProprietorName);
            tvWebsite = itemView.findViewById(R.id.tvWebsite);
            tvEmail = itemView.findViewById(R.id.tvEmail);
            tvFirstAvailableDate = itemView.findViewById(R.id.tvFrstAvailableDate);
            tvFirstAvailableTimeBlock = itemView.findViewById(R.id.tvFirstAvailableTimeBlock);
            tvAvailableInPostalCode = itemView.findViewById(R.id.tvPostalCodeAvailable);
            tvAvailableNumberOfPersons = itemView.findViewById(R.id.tvAvailableNumberOfPersons);
            btnWebsite = itemView.findViewById(R.id.btnWebsite);
            tvWebsite.setClickable(true);


            tvWebsite.setOnClickListener(new View.OnClickListener()
            {

                @Override
                public void onClick(View view) {
                    if (mContext instanceof SearchForHelp) {
                        ((SearchForHelp) mContext).ClickWebsite();
                    }

                }
            });






            btnWebsite.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    if (mContext instanceof SearchForHelp) {
                        ((SearchForHelp) mContext).ClickButton();
                    }
                }
            });


        }
        @Override
        public void onClick(View view) {

        }





    }


    @NonNull
    @Override
    public CompanyAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {

        View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.list_items, viewGroup, false);

        return new ViewHolder(v);
    }

    @Override
    public void onBindViewHolder(@NonNull CompanyAdapter.ViewHolder viewHolder, int i) {

        viewHolder.itemView.setTag(companyname.get(i));

        viewHolder.tvCompanyName.setText(companyname.get(i).getStrCompanyName());
        viewHolder.tvVatID.setText(companyname.get(i).getStrVatID());
        viewHolder.tvPostalCode.setText(companyname.get(i).getStrPostalCode());
        viewHolder.tvPhoneNumber.setText(companyname.get(i).getStrPhoneNumber());
        viewHolder.tvProprietorName.setText(companyname.get(i).getStrProprietorName());
        viewHolder.tvWebsite.setText(companyname.get(i).getStrWebsite());
        viewHolder.tvEmail.setText(companyname.get(i).getStrEmail());
        viewHolder.tvFirstAvailableDate.setText(companyname.get(i).getStrFirstAvailableDate());
        viewHolder.tvFirstAvailableTimeBlock.setText(companyname.get(i).getStrFirstAvailableTimeBlock());
        viewHolder.tvAvailableInPostalCode.setText(companyname.get(i).getStrAvailableInPostalCode());
        viewHolder.tvAvailableNumberOfPersons.setText(companyname.get(i).getStrAvailableNumberOfPersons());

        viewHolder.tvWebsite.setOnClickListener(new View.OnClickListener()
        {

            @Override
            public void onClick(View view) {
                //Toast.makeText(getClass(),"Test",Toast.LENGTH_SHORT).show();


                //viewHolder.tvCompanyName.setText("Changed");


            }
        });


    }

    @Override
    public int getItemCount() {
        return companyname.size();
    }
}

最后,在我的 Activity 中:

public void ClickButton()
{
    Toast.makeText(getApplicationContext(),"Clicked on Button",Toast.LENGTH_LONG).show();
}


public void ClickWebsite()
{
    Toast.makeText(getApplicationContext(),"Clicked on TextView",Toast.LENGTH_LONG).show();
}

请注意,

tvWebsite.setClickable(true);

已添加以查看是否有任何不同,但没有。

如果我点击按钮,它会提示“点击按钮”,但如果我点击 TextView,则没有任何反应。

那么,为了使 TextView tvWebsite 可点击,我错过了什么?

不需要tvWebsite.setClickable(true);

并且您再次在 onBindViewHolder 回调中为 tvWebsite 设置点击侦听器。

您需要从 onBindViewHolder 方法中删除此代码。

viewHolder.tvWebsite.setOnClickListener(new View.OnClickListener()
        {

            @Override
            public void onClick(View view) {
                //Toast.makeText(getClass(),"Test",Toast.LENGTH_SHORT).show();


                //viewHolder.tvCompanyName.setText("Changed");


            }
        });

------------休息就好。