我想构建一个RecyclerView,每行中有几列可以点击不同的事件。不幸的是,我无法确定在行中单击哪个onclick,因为它们都调用相同的方法。处理这个问题的最佳方法是什么?我应该在行中声明多个视图并为每个视图指定一个onclick吗?
这是我的recyclerview.xml文件:
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<RelativeLayout
android:id="@+id/layout"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:text="Description"
android:id="@+id/description_textview"
android:layout_width="180dp"
android:layout_height="wrap_content"
android:textSize="18sp"
android:textStyle="bold"
android:textColor="@color/colorBlack"
android:paddingLeft="4dp"
/>
<TextView
android:text="99"
android:id="@+id/qty_textview"
android:layout_width="60dp"
android:layout_height="wrap_content"
android:textSize="18sp"
android:textStyle="bold"
android:textColor="@color/colorBlack"
android:layout_toRightOf="@id/description_textview"
android:gravity="center"
/>
<TextView
android:text="N"
android:id="@+id/accept_textview"
android:layout_width="80dp"
android:layout_height="wrap_content"
android:textSize="18sp"
android:textStyle="bold"
android:textColor="@color/colorBlack"
android:layout_toRightOf="@id/qty_textview"
android:gravity="center"
/>
</RelativeLayout>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/colorBackgroundGray"
android:layout_below="@id/layout"
style="?android:listSeparatorTextViewStyle"
/>
</RelativeLayout>
这是我的recyclerview持有人代码(正常的recyclerview)。我想用不同的列替换onLongClick事件:
private class RecyclerHolder2 extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener {
private TextView descriptionTextView;
private TextView qtyTextView;
private TextView acceptTextView;
private VerificationModel verificationModel;
public RecyclerHolder2(View itemView) {
super(itemView);
itemView.setOnClickListener(this);
itemView.setOnLongClickListener(this);
descriptionTextView = (TextView) itemView.findViewById(R.id.description_textview);
qtyTextView = (TextView) itemView.findViewById(R.id.qty_textview);
acceptTextView = (TextView) itemView.findViewById(R.id.accept_textview);
}
public void bindRecyclerData(VerificationModel newItem) {
verificationModel = newItem;
descriptionTextView.setText(verificationModel.getDescription());
qtyTextView.setText(verificationModel.getQty());
acceptTextView.setText(verificationModel.getAccept());
}
@Override
public void onClick(View v) {
boolean accepted = true;
for (int i = 0; i < mVerifys.size(); i++) {
if (mVerifys.get(i).equals(verificationModel)) {
if (mVerifys.get(i).getAccept().equals("N")) {
mVerifys.get(i).setAccept("Y");
mVerifys.get(i).setSelected(true);
Timber.d(verificationModel.getDescription() + " was accepted");
} else {
mVerifys.get(i).setAccept("N");
mVerifys.get(i).setSelected(false);
Timber.d(verificationModel.getDescription() + " was unaccepted");
}
}
if (mVerifys.get(i).getAccept().equals("N")) {
accepted = false;
}
}
mRecyclerAdapter2.notifyDataSetChanged();
if (accepted) {
mAcceptedButton.setEnabled(true);
}
}
@Override
public boolean onLongClick (View v) {
Timber.d(verificationModel.getDescription() + " will be adjusted");
Intent intent = new Intent(VerificationDetailActivity.this, InvoiceAuthorizationActivity.class);
startActivity(intent);
return true;
}
}
答案 0 :(得分:1)
现在,你正在设置你的听众:
itemView.setOnClickListener(this);
itemView.setOnLongClickListener(this);
有两种不同的方式可以实现您的目标。
第一种方法是为每个视图使用相同的View.OnClickListener
,然后根据点击的视图ID更改您的操作。
public RecyclerHolder2(View itemView) {
super(itemView);
...
descriptionTextView.setOnClickListener(this);
descriptionTextView.setOnLongClickListener(this);
qtyTextView.setOnClickListener(this);
qtyTextView.setOnLongClickListener(this);
acceptTextView.setOnClickListener(this);
acceptTextView.setOnLongClickListener(this);
...
}
@Override
public void onClick(View v) {
if (v.getId() == R.id.description_textview) {
...
}
else if (...) {
...
}
}
第二个(我推荐的那个)是为每个视图使用不同的View.OnClickListener()
。这将使您编写更多代码,但更明显的是,不同的点击会执行不同的操作。 (如果你正在使用RetroLambda,你可以省略大部分样板文件。)
private View.OnClickListener descriptionListener = new View.OnClickListener() {
@Override
public void onClick(View view) {
...
}
};
private View.OnClickListener quantityListener = new View.OnClickListener() {
@Override
public void onClick(View view) {
...
}
};
public RecyclerHolder2(View itemView) {
super(itemView);
...
descriptionTextView.setOnClickListener(descriptionListener);
qtyTextView.setOnClickListener(quantityListener);
...
}
答案 1 :(得分:0)
您可以从getAdapterPosition()
致电ViewHolder
,RecyclerView
会返回RecyclerView
中项目的位置。使用该位置,您可以找到已单击的行。
返回的位置是基于volumes:
- db:/var/lib/mysql
- "./docker/mysql/conf.d:/etc/mysql/conf.d"
- "./docker/mysql/init.d:/docker-entrypoint-initdb.d"
中的总项目的位置,而不仅仅是屏幕上可见的项目。
答案 2 :(得分:0)
你应该听听你想要的"variables":{"valid":true, "vesselStatus":"S"}
。使用TextView
,您可以收听整个适配器项目。您应该使用itemView.setOnClickListener(this);
,因为您希望收听特定视图,并在acceptTextView.setOnClickListener(this);
方法中检查所点击的项目。
onClick()
答案 3 :(得分:0)
处理点击事件最干净的方法是使用Butterknife库并为所有点击设置单独的方法。它删除了很多样板代码,并且非常容易使用。在这里查看如何使用Butterknife - http://jakewharton.github.io/butterknife/
另一种方法是为每个TextView提供不同的onClick方法。喜欢这个
android:onClick="textButton1Clicked"
另一种方法是在onclick中获取TextViews的ID,并查看用户点击的内容
if (view.getID() == R.id.textView1) {
} else (view.getID() == R.id.textView2) {
} else (view.getID() == R.id.textView3) {
}
您还可以使用switch语句以获得更好的可维护性。