2015-05-17 86 views
3

我正在使用CardView布局作为RecyclerView的行。不过,我在将OnClickListener附加到布局时遇到了问题。 我使用以下布局RecyclerView中CardView和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,每件事情都可以正常工作。 我不知道这里有什么问题。有人可以帮助我吗?

谢谢。

+0

发布完整的适配器和用于初始化recyclerView的代码和听众的设置。 – theapache64

+0

添加了代码。 –

+0

对不起,这是我的知识。 – theapache64

回答

5

实际上实现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

是的,它适合我!在额外的我添加接口,它是完美的作品! –

0

的问题是与方式的布局是设置为行。我做了一个线性布局作为最上面的元素,从而使得卡片视图成为它的孩子,并开始工作。

0

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

0

我的recyclerView卡内没有反应,当我点击,
问题是我的CardView的父标签是ScrollView。换句话说,我的row_layout即CardView在ScrollView中。因此我删除了它的ScrollView。

2

完善的通用解决方案

**第1步:**转到XML在cardview是placed.Assign它一个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步:**内部视图holder类获得持有卡片视图的ID

public class View_Holder_For_Grocery extends RecyclerView.ViewHolder { CardView cv;

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

}

**步骤3:**内Recycler_View_Adapter类onBindViewHolder方法的onClick是如下

@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; 

       } 

      } 
     }); 
    }