RecyclerView中的CardView和OnClickListener问题

时间:2015-05-17 13:35:49

标签: android android-recyclerview android-cardview

我使用CardView布局作为RecyclerView的Row。但是,我在将OnClickListener附加到布局时遇到问题。 我正在使用以下布局

<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:id="@+id/card_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_margin="@dimen/unit_5"
    android:clickable="true"
    android:longClickable="true"
    card_view:cardCornerRadius="@dimen/unit_5">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="@dimen/spinnerWidth"
        android:background="@drawable/row_item_background"
        android:clickable="true"
        android:orientation="vertical"
        android:padding="@dimen/dialog_left_padding">

<!-- Other items -->

        </LinearLayout>

        </android.support.v7.widget.CardView>

以下是我的适配器和ViewHolder

 private class SampleAdapter extends RecyclerView.Adapter<SampleViewHolder> {
        ArrayList<Item> arrayList;
        private LayoutInflater inflater;

        public SampleAdapter(Context context) {
            inflater = LayoutInflater.from(context);
            this.arrayList = new ArrayList<>();
            arrayList.addAll(items);
        }

        @Override
        public SampleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View view = inflater.inflate(R.layout.layout1, parent, false);
            SampleViewHolder holder = new SampleViewHolder(view);
            holder.setClickHandler(handler);
            return holder;
        }

        @Override
        public void onBindViewHolder(SampleViewHolder holder, int position) {

        }

        @Override
        public int getItemCount() {
            return arrayList.size();
        }

    }

  static class SampleViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener {
        TextView name;
        IClickHandler clickHandler;
        public IClickHandler getClickHandler() {
            return clickHandler;
        }

        public void setClickHandler(IClickHandler clickHandler) {
            this.clickHandler = clickHandler;
        }

        public SampleViewHolder(View itemView) {
            super(itemView);
            name = (TextView) itemView
                    .findViewById(R.id.name);
            itemView.setOnClickListener(this);
            itemView.setOnLongClickListener(this);
        }


        @Override
        public void onClick(View view) {
            if (getClickHandler() != null) {
                getClickHandler().onItemClicked(view, getLayoutPosition());
            }
        }

        @Override
        public boolean onLongClick(View view) {
            if (getClickHandler() != null) {
                getClickHandler().onItemLongClicked(view, getLayoutPosition());
            }
            return true;
        }
    }

但是这个onClick永远不会被解雇。

但是,如果我用LinearLayout替换CardView,一切正常。 我不知道这里有什么问题。有人可以帮助我吗?

感谢。

6 个答案:

答案 0 :(得分:6)

实际上实现onClick非常简单,我不确定自定义点击处理程序(IClickHandler)的实现。

首先,View持有人应该只是:

static class SampleViewHolder extends RecyclerView.ViewHolder {
  TextView name;

  public SampleViewHolder(View itemView) {
    super(itemView);
    name = (TextView) itemView.findViewById(R.id.name);
  }
}

然后在SampleAdapter中

@Override
public SampleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
  View view = inflater.inflate(R.layout.layout1, parent, false);
  SampleViewHolder holder = new SampleViewHolder(view);
  return holder;
}

@Override
public void onBindViewHolder(SampleViewHolder holder, int position) {
    final Item item = arrayList.get(position);

    holder.name.setOnClickListener(new View.OnClickListener(){

       @Override
       public void onClick(View view) {
         //notice I implemented onClickListener here
         // so I can associate this click with final Item item           
       }

    });

}

答案 1 :(得分:2)

完美的通用解决方案

**步骤1:**转到放置cardview的xml。将其分配给id

<android.support.v7.widget.CardView
    android:id="@+id/cardView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginBottom="@dimen/activity_vertical_margin"
    app:cardCornerRadius="@dimen/activity_vertical_margin"
    app:cardElevation="@dimen/activity_vertical_margin"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"/>

**步骤2:** Inside View holder类获取卡片视图的ID

公共类View_Holder_For_Grocery扩展了RecyclerView.ViewHolder {     CardView cv;

View_Holder_For_Grocery(View itemView) {
    super(itemView);
    cv = (CardView) itemView.findViewById(R.id.cardView);
}

}

**步骤3:**在Recycler_View_Adapter类中,onClick的onBindViewHolder方法如下所示

  @Override
    public void onBindViewHolder(View_Holder_For_Grocery holder, final int position) {

        holder.cv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                switch (position){
                    case 0:
                        Intent intent0=new Intent(v.getContext(),SunrayActivity.class);
                        v.getContext().startActivity(intent0);
                        break;
                     case 1:
                        Intent intent1=new Intent(v.getContext(),SunfeastActivity.class);
                        v.getContext().startActivity(intent1);
                        break;
                    case 2:
                        Intent intent2=new Intent(v.getContext(),SunriseActivity.class);
                        v.getContext().startActivity(intent2);
                        break;

                }

            }
        });
    }

答案 2 :(得分:1)

我遇到了类似的问题。 OnClick似乎没有工作。问题是我的布局的根视图是相对布局......所以我将其更改为卡片视图(并在其中添加了相对布局)并且它工作正常。

答案 3 :(得分:0)

问题在于为行设置布局的方式。我做了一个线性布局作为最顶层的元素,从而使卡片视图成为它的孩子,一切都开始工作。

答案 4 :(得分:0)

点击时,我的recyclelerView卡内部没有响应,
问题是我的CardView的父标签是ScrollView。换句话说,我的row_layout,即CardView在ScrollView内部。所以我删除了它运行的ScrollView。

答案 5 :(得分:0)

我遇到了同样的问题。 在我的情况下,问题是我已经设置

    android:clickable="true"
    android:focusable="true"

表示我的Cardview内部的相对布局。

因此,cardview上的点击监听器和整个itemView都没有被触发。

在那里浪费了4个小时。