2017-04-23 26 views
2

我有一个RecyclerView活动,列表中的每个项目如下所示。星星应该是可点击的,当用户点击它时,预计会变成黑星。如果使用单击列表项目,它将输入新的活动,其中提供了与所选列表项目相对应的更多详细信息。 :由于容器本身的点击侦听器,无法处理点击Recycler视图中的项目

enter image description here

这是列表项的XML。

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/cont_item_root" 
android:layout_width="match_parent" 
android:layout_height="85dp" 
android:background="@drawable/background_state_drawable" 
android:clickable="true" 
> 

<ImageView 
    android:id="@+id/im_item_icon" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:paddingLeft="16dp" 
    android:src="@mipmap/ic_tonality_black_36dp" 
    android:layout_centerVertical="true" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentStart="true" /> 

<TextView 
    android:id="@+id/lbl_item_text" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_alignTop="@+id/im_item_icon" 
    android:layout_marginLeft="72dp" 
    android:layout_marginRight="48dp" 
    android:ellipsize="end" 
    android:fontFamily="sans-serif" 
    android:singleLine="true" 
    android:text="Sois comme l'eau mon ami" 
    android:textColor="@android:color/black" 
    android:textSize="16sp" /> 

<TextView 
    android:id="@+id/lbl_item_sub_title" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_below="@+id/lbl_item_text" 
    android:layout_marginLeft="72dp" 
    android:layout_marginRight="48dp" 
    android:ellipsize="end" 
    android:fontFamily="sans-serif" 
    android:singleLine="true" 
    android:text="Mononc' J" 
    android:textSize="14sp" /> 

<ImageView 
    android:id="@+id/im_item_icon_secondary" 
    android:layout_width="wrap_content" 
    android:layout_height="match_parent" 
    android:layout_alignParentRight="true" 
    android:layout_centerVertical="true" 
    android:padding="16dp" 
    android:src="@mipmap/ic_star_border_black_24dp" 
    android:background="@drawable/background_state_drawable" 
    /> 

</RelativeLayout> 

适配器中的嵌套类为我处理点击事件。

class DerpHolder extends RecyclerView.ViewHolder implements View.OnClickListener 
    { 
     private TextView title; 
     private TextView subTitle; 
     private ImageView thumbnail; 
     private ImageView secondaryIcon; 
     private View container; 

     public DerpHolder(View itemView) { 
      super(itemView); 

      title = (TextView)itemView.findViewById(R.id.lbl_item_text); 
      subTitle = (TextView)itemView.findViewById(R.id.lbl_item_sub_title); 
      thumbnail = (ImageView)itemView.findViewById(R.id.im_item_icon); 
      secondaryIcon = (ImageView)itemView.findViewById(R.id.im_item_icon_secondary); 
      container = (View)itemView.findViewById(R.id.cont_item_root); 
      container.setOnClickListener(this); 
     } 

     @Override 
     public void onClick(View v) { 
      Log.w("RecyclerView","Item with id : " + v.getId() + " touched"); 
      if(v.getId() == R.id.cont_item_root) 
      { 
       Log.w("RecyclerView","list item clicked"); 
       itemClickCallback.onItemClick(getAdapterPosition()); 
      } 
      else 
      { 
       Log.w("RecyclerView","star clicked"); 
       itemClickCallback.onSecondaryIconClick(getAdapterPosition()); //not able to come here 
      } 
     } 
    } 

我能够进入if的第一部分,也就是我能够接受的listItem点击的点击事件。然而,当用户点击星号时,它也被视为整个列表项被点击,因为星星位于容器内。

我怎样才能单独接收星星上的点击,使点击星号不被视为点击列表项目?

编辑

添加行android:descendantFocusability="blocksDescendants"在列表项的RelativeLayout固定的问题。但任何人都可以解释它是如何修复它的。按名称,它预计会阻止后代并吃点击事件。但是,这种行为是相反的。

+0

[ListView中的按钮不可点击]的可能重复(http://stackoverflow.com/questions/20709755/button-inside-listview-not-clickable) –

+1

或更好... http://stackoverflow.com/ 30284067/handle-button-click-in-row-in-recyclerview –

回答

0

反转if/else语句并为星形图像添加点击侦听器。它应该工作,因为要触发的recyclerview项目听者如果明星不点击

class DerpHolder extends RecyclerView.ViewHolder implements View.OnClickListener 
    { 
     private TextView title; 
     private TextView subTitle; 
     private ImageView thumbnail; 
     private ImageView secondaryIcon; 
     private View container; 

     public DerpHolder(View itemView) { 
      super(itemView); 

      title = (TextView)itemView.findViewById(R.id.lbl_item_text); 
      subTitle = (TextView)itemView.findViewById(R.id.lbl_item_sub_title); 
      thumbnail = (ImageView)itemView.findViewById(R.id.im_item_icon); 
      secondaryIcon = (ImageView)itemView.findViewById(R.id.im_item_icon_secondary); 
      container = (View)itemView.findViewById(R.id.cont_item_root); 
      container.setOnClickListener(this); 
      secondaryIcon.setOnClickListener(this); 
     } 

     @Override 
     public void onClick(View v) { 
      Log.w("RecyclerView","Item with id : " + v.getId() + " touched"); 
      if(v.getId() == R.id.im_item_icon_secondary) 
      { 
       Log.w("RecyclerView","star clicked"); 
       itemClickCallback.onSecondaryIconClick(getAdapterPosition()); 
      } 
      else 
      { 
       Log.w("RecyclerView","list item clicked"); 
       itemClickCallback.onItemClick(getAdapterPosition()); 
      } 
     } 
    } 

希望这有助于

+1

这只适用于点击监听器实际上被添加到图片 –

+0

@ cricket_007谢谢指出!我认为它被添加了 –

0

既然你只是想获得明星的点击,您应该设置OnClickListener只是明星:

public DerpHolder(View itemView) { 
     super(itemView); 

     title = (TextView)itemView.findViewById(R.id.lbl_item_text); 
     subTitle = (TextView)itemView.findViewById(R.id.lbl_item_sub_title); 
     thumbnail = (ImageView)itemView.findViewById(R.id.im_item_icon); 
     secondaryIcon = (ImageView)itemView.findViewById(R.id.im_item_icon_secondary); 
     secondaryIcon.setOnClickListener(this); 
    } 
0

你忘了onClick监听器添加到secondaryIcon

试试这个:

class DerpHolder extends RecyclerView.ViewHolder implements View.OnClickListener 
{ 
    private TextView title; 
    private TextView subTitle; 
    private ImageView thumbnail; 
    private ImageView secondaryIcon; 
    private View container; 

    public DerpHolder(View itemView) { 
     super(itemView); 

     title = (TextView)itemView.findViewById(R.id.lbl_item_text); 
     subTitle = (TextView)itemView.findViewById(R.id.lbl_item_sub_title); 
     thumbnail = (ImageView)itemView.findViewById(R.id.im_item_icon); 
     secondaryIcon = (ImageView)itemView.findViewById(R.id.im_item_icon_secondary); 
     container = (View)itemView.findViewById(R.id.cont_item_root); 

     container.setOnClickListener(this); 
     secondaryIcon.setOnClickListener(this);  
    } 

    @Override 
    public void onClick(View v) { 
     if(v.getId() == secondaryIcon.getId()) 
     { 
      Log.w("RecyclerView","star clicked"); 
      itemClickCallback.onSecondaryIconClick(getAdapterPosition()); 
     } 
     else 
     { 
      Log.w("RecyclerView","list item clicked"); 
      itemClickCallback.onItemClick(getAdapterPosition()); 
     } 
    } 
} 

希望这将有助于〜

0

您还可以在回收站适配器类声明的onclick项目用于行的具体意见的像下面。

@Override 
public void onBindViewHolder(ViewHolder holder, final int position) { 
     // - get element from your dataset at this position 
     // - replace the contents of the view with that element 

     holder.linRootMain.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       //Do your stuff here. 
      } 
     }); 

     holder.imgStart.setOnClickListner(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       //Do your stuff here. 
      } 
     }); 
} 

我希望这会帮助你。

相关问题