android - 只有 recyclerview 单元格中的图标是可点击的

标签 android event-handling android-recyclerview

我检查了如何制作可点击的 RecyclerView 的各种示例,并创建了一个示例,其中每一行在左侧都有一个图标,在右侧有两个文本标签相互堆叠,但我只能在单击时触发单击处理程序在图标上。我希望能够单击行中的任意位置。我在这段代码中做错了什么?

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.RecyclerView android:id="@+id/record_list"
    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="match_parent"
    android:layout_marginLeft="16dp"
    android:layout_marginRight="16dp"
    android:clickable="true"
    app:layoutManager="LinearLayoutManager"
    tools:listitem="@layout/list_content"/>

<!-- list content -->
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:clickable="true"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
    <ImageView
        android:id="@+id/icon"
        android:layout_width="30dp"
        android:layout_height="30dp"
        android:src="@drawable/ic_icon"/>
    <TextView
        android:id="@+id/desc"
        style="?android:attr/textAppearanceMedium"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_toEndOf="@id/icon"
        android:layout_toRightOf="@id/icon"
        android:layout_alignParentEnd="true"
        android:layout_alignParentRight="true"
        android:padding="0dp"
        android:textIsSelectable="true"/>
    <TextView
        android:id="@+id/user_type"
        style="?android:attr/textAppearanceSmall"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_toEndOf="@id/icon"
        android:layout_toRightOf="@id/icon"
        android:layout_below="@id/desc"
        android:layout_alignParentEnd="true"
        android:layout_alignParentRight="true"
        android:padding="0dp"
        android:textIsSelectable="true"
        android:textStyle="italic"/>
</RelativeLayout>

    public class SimpleItemRecyclerViewAdapter
            extends RecyclerView.Adapter<SimpleItemRecyclerViewAdapter.ViewHolder> {

        private final List<Record> mValues;

        public SimpleItemRecyclerViewAdapter(List<Record> items) {
            mValues = items;
        }

        @Override
        public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.list_content, parent, false);
            return new ViewHolder(view);
        }


        @Override
        public void onBindViewHolder(final ViewHolder holder, final int position) {
            Record record = mValues.get(position);
            holder.mIcon.setImageResource(record.iconRes);
            holder.mDescText.setText(record.desc);
            holder.mDetailText.setText(record.detail);
            holder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Context context = v.getContext();
                    Intent intent = new Intent(context, DetailActivity.class);
                    context.startActivity(intent);
                }
            });
        }

        public class ViewHolder extends RecyclerView.ViewHolder {
            public final ImageView mIcon;
            public final TextView mDescText;
            public final TextView mDetailText;

            public ViewHolder(View view) {
                super(view);
                mIcon = (ImageView)view.findViewById(R.id.icon);
                mDescText = (TextView) view.findViewById(R.id.desc);
                mDetailText = (TextView) view.findViewById(R.id.detail);
            }
        }
}

已更新

当我点击该行时,我看到 logcat 记录了下面的行

I/ViewRootImpl: ViewRoot's Touch Event : ACTION_DOWN
I/ViewRootImpl: ViewRoot's Touch Event : ACTION_UP

所以有些东西正在响应,但它不是 itemView 并且 itemView 没有父级。

最佳答案

尝试处理列表内容的根元素的点击事件。 在您的情况下,它将是 RelativeLayout。

您的列表内容如下。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/rootLay"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clickable="true">

<ImageView
    android:id="@+id/icon"
    android:layout_width="30dp"
    android:layout_height="30dp"
    android:src="@drawable/ic_icon" />

<TextView
    android:id="@+id/desc"
    style="?android:attr/textAppearanceMedium"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_alignParentEnd="true"
    android:layout_alignParentRight="true"
    android:layout_toEndOf="@id/icon"
    android:layout_toRightOf="@id/icon"
    android:padding="0dp"
    android:textIsSelectable="true" />

<TextView
    android:id="@+id/user_type"
    style="?android:attr/textAppearanceSmall"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_alignParentEnd="true"
    android:layout_alignParentRight="true"
    android:layout_below="@id/desc"
    android:layout_toEndOf="@id/icon"
    android:layout_toRightOf="@id/icon"
    android:padding="0dp"
    android:textIsSelectable="true"
    android:textStyle="italic" />
</RelativeLayout>

您的适配器文件将如下所示。

public class SimpleItemRecyclerViewAdapter
        extends RecyclerView.Adapter<SimpleItemRecyclerViewAdapter.ViewHolder> {

    private final List<Record> mValues;

    public SimpleItemRecyclerViewAdapter(List<Record> items) {
        mValues = items;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.list_content, parent, false);
        return new ViewHolder(view);
    }


    @Override
    public void onBindViewHolder(final ViewHolder holder, final int position) {
        Record record = mValues.get(position);
        holder.mIcon.setImageResource(record.iconRes);
        holder.mDescText.setText(record.desc);
        holder.mDetailText.setText(record.detail);
        /*holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Context context = v.getContext();
                Intent intent = new Intent(context, DetailActivity.class);
                context.startActivity(intent);
            }
        });*/

        holder.mRootLay.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Context context = v.getContext();
                Intent intent = new Intent(context, DetailActivity.class);
                context.startActivity(intent);
            }
        });
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        public final ImageView mIcon;
        public final TextView mDescText;
        public final TextView mDetailText;
        public final RelativeLayout mRootLay;

        public ViewHolder(View view) {
            super(view);
            mIcon = (ImageView)view.findViewById(R.id.icon);
            mDescText = (TextView) view.findViewById(R.id.desc);
            mDetailText = (TextView) view.findViewById(R.id.detail);
            mRootLay = (RelativeLayout) view.findViewById(R.id.rootLay);
        }
    }
}                                  

关于android - 只有 recyclerview 单元格中的图标是可点击的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42432052/

相关文章:

滚动时的Android工具栏提升

java - 在android中的textview中将 vector drawable设置为side drawable

android - 无法在自定义 View 中使用 typedarray

angular - 如何在输入字段中为 Angular 4 中的指令获取更改事件

java - 在 ViewHolder 中使用 RxJava

android - 如何实现从Fragment A到Fragment B的监听器?

android - 在Android NDK下,是否可以在不调用Java来检索表面的情况下创建 native 窗口?

android - android项目中的GIT子模块导致 "Unable to ignore resources"错误

javascript - 如何处理事件监听器和共享状态中的竞争条件?

c# - 从 Eventhandler 中删除所有方法