【问题标题】:How to be redirected to another activity when clicked on ViewHolder that contains a RecyclerView?单击包含 RecyclerView 的 ViewHolder 时如何重定向到另一个活动?
【发布时间】:2019-03-28 14:45:35
【问题描述】:

我正在使用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 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>

这是它的图像:

【问题讨论】:

    标签: android android-recyclerview android-adapter android-viewholder


    【解决方案1】:

    据我了解,您希望通过单击 while recycler 行/项目来重定向用户。然后,您需要使 itemView 的父布局可点击和聚焦。您没有为itemView 提供xml 布局,但我会尝试解释。您的itemView 是一个单独的 xml 布局文件,其中包含图像和文本框,它们都被添加到父线性/约束/相对布局中。这个父布局需要有clickable = truefocusable = true 才能接受点击事件。

    我们建立的问题是嵌套回收器消耗了点击事件。如果预计嵌套回收器不可滚动,则阻止此事件的方法是将setLayoutFrozen(true) 添加到嵌套回收器。 教程linkdocs

    【讨论】:

    • 您好,也感谢您抽出宝贵时间回答我的问题。请查看我已编辑的问题,我在其中添加了 itemView 的布局文件。我已将android:focusable="false"android:clickable="false" 添加到我的CradView,但它也不起作用。请看一看。
    • 我的回答建议在您尝试调用点击时添加可点击的 TRUE 和可聚焦的 TRUE :)
    • 对此很抱歉,但我也将两者都设置为 true,但它也不起作用。你怎么知道为什么?
    • 我现在看到了,您的嵌套回收器捕获了点击事件,您是否已经尝试让 CHILD 回收器(在 itemview 内)可点击为假?
    • 是的,就是这么回事,嵌套的 RecyclerView 捕获了点击事件。是的,我一开始就这样做了,但它不起作用:(你还有其他想法吗?
    【解决方案2】:

    很简单,您可以实现一个界面并从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;
    }
    

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

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

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

    【讨论】:

    • 感谢您抽出宝贵时间回答我的问题,但我刚刚尝试了您的解决方案,它和以前一样。我认为这是因为我将侦听器设置在同一个 itemView 对象上。我也认为这与RecyclerView 有关,它的行为与其他视图不同。当我点击RecyclerView 时什么也没有发生 :(你试过还是有其他解决方案?
    • 我已经用 ImageView 和 TextView 代替 RecyclerView 进行了测试,它工作完美,但 RecyclerView 不工作。我认为这是因为当我单击时,它会尝试滚动元素而不是保持父 itemView 的单击。我也尝试禁用点击它并没有帮助。
    • 你还有什么想法吗?
    • @JohansBormman 让我更好地理解它,你有一些嵌套的 RecyclerViews 并且你想要点击整个 RecyclerView 项目? (嵌套的)
    • 不,我有一个包含一些项目的 RecyclerView。每个项目都有一个 TextView、一个 ImageView 和一个 RecyclerView。 ThisitemView 的样子。当我单击 ImageView、TextView 而不是单击 RecyclerView 时,我被重定向得很好。如果我删除 RecyclerView 或添加另一个 ImageView 而不是 RecyclerView,一切正常,但使用 RecyclerView 点击不起作用。希望我现在已经清楚了,或者?
    【解决方案3】:

    如果它是一个静态活动并且它不会随着时间而改变,你可以做这样的事情,否则使用一个界面。

    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!!!
    }
    

    【讨论】:

    • 嗨胡安赫尔塔多!问题不在于重定向部分,问题在于我无法点击RecyclerView。从 Ionut J. Bejan 的回答中查看我的 cmets。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-06
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多