问题描述
现在我的 RecyclerView 可以工作了,我可以在我的 Activity 和我的适配器之间进行通信,我想创建一个 OnClickListener,我成功地做到了。
但不知何故,它只适用于按钮,而不适用于其他项目。
<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 是可点击的。该按钮也是,但这是默认行为。
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();
}
}
最后,在我的活动中:
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);
并且您再次在 tvWebsite
回调中为 onBindViewHolder
设置点击侦听器。
您需要从 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");
}
});
---------休息就好。