单击包含 RecyclerView 的 ViewHolder 时如何重定向到另一个 activity?

How to be redirected to another activity when clicked on ViewHolder that contains a RecyclerView?

我正在使用 RecyclerView 来显示一些数据。对于每个项目,我都有一个自定义布局,在一些文本视图旁边有一个 RecyclerView:

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v7.widget.RecyclerView
        android:layout_width="180dp"
        android:layout_height="45dp"
        android:id="@+id/recycler_view"/>

    //Other text views
</RelativeLayout>

这是我的适配器class:

class UserViewHolder extends RecyclerView.ViewHolder {
    View itemView;
    RecyclerView recyclerView;

    UserViewHolder(View itemView) {
        super(itemView);
        this.itemView = itemView;
        recyclerView = itemView.findViewById(R.id.recycler_view);
    }

    void bind(User user) {
        itemView.setOnClickListener(view -> {
            //Move to user Activity
        });

        UserAdapter adapter = new UserAdapter(user.list);
        recyclerView.setAdapter(adapter);

        itemView.bringToFront(); //Doesn't work!!!
    }
}

我在整个 itemView 上设置了点击侦听器,因此我可以被重定向到用户的 activity。问题是,当我单击 RecyclerView 中存在的元素时,我没有被重定向。我试图将 itemView 放在 RecyclerView 前面,但没有成功。我应该如何操作才能将我重定向到用户 activity,即使我单击 RecyclerView?谢谢!

编辑:

这是我的 itemView 布局的样子:

<android.support.v7.widget.CardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:focusable="true"
    android:clickable="true">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        //One TextView
        //One ImageView
        //One RecyclerView
    </RelativeLayout>
</android.support.v7.widget.CardView>

这是它的图片:

很简单,您可以实现一个界面并从 activity / 片段中使用它,而不是尝试从适配器内在新屏幕上导航,其中 RecyclerView 是可见的。

示范[​​=16=]

class UserViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
    View itemView;
    RecyclerView recyclerView;

    UserViewHolder(View itemView) {
        super(itemView);
        this.itemView = itemView;
        recyclerView = itemView.findViewById(R.id.recycler_view);
    }

    @Override
    public void onClick(View v) {
        if (listener != null)
           listener.onItemListClicked(getAdapterPosition());
    }

    void bind(User user) {
        itemView.setOnClickListener(this);

        UserAdapter adapter = new UserAdapter(user.list);
        recyclerView.setAdapter(adapter);

        itemView.bringToFront(); //Doesn't work!!!
    }
}

接口应该放在 UserViewHolder class 之外。

public interface MyClickListener{
    void onItemListClicked(int position);
}

您将在适配器中有一个 public 方法,它将设置侦听器

public void setListenerForAdapter(MyClickListener listener) {
    this.listener = listener;
}

最后在你的 activity 中将侦听器设置为适配器

adapter.setListener(/*here you will implement your custom listener and start a new activity / fragment based on which position was clicked*/);

如有任何其他问题,请随时提出。 编码愉快!

如果它是静态的activity并且它不会随时间改变,你可以做这样的事情,否则使用接口。

class UserViewHolder extends RecyclerView.ViewHolder {
View itemView;
RecyclerView recyclerView;

UserViewHolder(View itemView) {
    super(itemView);
    this.itemView = itemView;
    recyclerView = itemView.findViewById(R.id.recycler_view);
}

void bind(User user) {
    itemView.setOnClickListener(view -> {
        view?.context?.startActivity(Intent(view?.context, YourDestinationActivity::class.java))
    // this is kotlin code just parse it to java 
    });

    UserAdapter adapter = new UserAdapter(user.list);
    recyclerView.setAdapter(adapter);

    itemView.bringToFront(); //Doesn't work!!!
}

据我了解,您希望通过单击 while 回收器 row/item 来重定向用户。然后,您需要使 itemView 的父布局可点击且可聚焦。您没有为 itemView 提供 xml 布局,但我会尽力解释。您的 itemView 是一个单独的 xml 布局文件,其中包含图像和文本框,它们都被添加到父 Linear/Constraint/Relative 布局中。此父布局需要 clickable = truefocusable = true 才能接受点击事件。

我们确定的问题是嵌套的回收器消耗了点击事件。如果嵌套回收器不希望滚动,则阻止此事件的方法是将 setLayoutFrozen(true) 添加到嵌套回收器。 教程link and docs