2015-05-17 120 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; 

       } 

      } 
     }); 
    }