首页 > 解决方案 > 单击包含 RecyclerView 的 ViewHolder 时如何重定向到另一个活动?

问题描述

我正在使用 aRecyclerView来显示一些数据。对于每个项目,我都有一个自定义布局,它在一些文本视图旁边保存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 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所以我可以被重定向到用户的活动。问题是当我单击 中存在的元素时RecyclerView,我没有被重定向。我试图把它itemView放在前面,RecyclerView但没有运气。我应该怎么做,即使我点击了,我也可以被重定向到用户活动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>

这是它的图像:

在此处输入图像描述

标签: androidandroid-recyclerviewandroid-adapterandroid-viewholder

解决方案


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

示范

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类之外。

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

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

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

最后在您的活动中将侦听器设置为适配器

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

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


推荐阅读