RecyclerView在textviews上有多个onclick事件

时间:2017-08-14 19:29:05

标签: android onclick android-recyclerview

我想构建一个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;
    }
}

4 个答案:

答案 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()致电ViewHolderRecyclerView会返回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语句以获得更好的可维护性。