在“回收”视图行中添加“单击侦听器到图像”按钮

时间:2016-03-28 10:38:27

标签: android

我使用循环视图,每行都有textview和image按钮。 在绑定我添加到图像按钮单击监听器,但当我尝试单击图像按钮时,它单击该行并仅在我长按图像按钮时作出反应。

有什么建议吗?

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

    if (isFolder(position)) {
        holder.folderName.setText(folders.get(position));

    }else{

        ImageButton edit = (ImageButton) holder.view.findViewById(R.id.browser_bookmark_row_edit);
        edit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                System.out.println(" ######### EDIT CLICKED");
                mListener.switchToEditBookmarkFragmentFolderAdapter(bookmarks.get(position - folders.size()));
            }
        });

        holder.folderName.setText(bookmarks.get(position - folders.size() ).getTitle());
    }

}




public class FolderViewHolder extends RecyclerView.ViewHolder {

    MuseoSansTextView folderName;
    View view;

    public FolderViewHolder(View itemView, MuseoSansTextView museoSansTextView) {
        super(itemView);

        view = itemView;
        folderName = museoSansTextView; //(MuseoSansTextView) itemView.findViewById(R.id.browser_bookmark_folder_name);

    }

}



<android.support.v7.widget.CardView
android:id="@+id/card_view_contact"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:descendantFocusability="blocksDescendants"
card_view:cardBackgroundColor="@color/transparent"
card_view:cardCornerRadius="@dimen/card_corner_radius"
card_view:cardUseCompatPadding="false"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:card_view="http://schemas.android.com/apk/res-auto">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="@dimen/activity_horizontal_margin">


        <com.osnewhorizon.pommmanager.ui.MuseoSansTextView
            android:id="@+id/browser_bookmark_row_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentStart="true"
            android:layout_toLeftOf="@+id/browser_bookmark_row_edit"
            android:layout_centerVertical="true"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"
            android:singleLine="true"
            android:textColor="@color/white"
            android:text="test"
            android:textSize="@dimen/contact_row_title_height" />

        <ImageButton
            android:id="@+id/browser_bookmark_row_edit"
            android:layout_width="30dp"
            android:layout_height="30dp"
            android:layout_centerVertical="true"
            android:layout_alignParentEnd="true"
            android:layout_marginRight="5dp"
            android:src="@drawable/edit"
            android:background="?android:attr/selectableItemBackground"
            android:clickable="true"/>


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

7 个答案:

答案 0 :(得分:3)

首先,您创建一个类似的界面:

public interface OnItemClickListener{
      void onItemClick(View view, int position)
}

在全球宣布:

private OnItemClickListener mOnItemClickListener;

接下来,您需要一个像:

这样的构造函数
public MyAdapter(Context context, List data, OnItemClickListener mOnItemClickListener){
    //...
    this.mOnItemClickListener= mOnItemClickListener;

}

并在onBindViewHolder

@Override
public void onBindViewHolder(final FolderViewHolder holder, final int position) {
      //....
      holder.image.setOnClickListener(new View.OnItemClickListener){
            @Override
            public void onClick(View v) {
                mOnItemClickListener.onItemClick(v,position);    
            }
        });
}

最后,您可以在类使用适配器中实现Callback,如:

public class A extends AppCombatActivity implements MyAdapter.OnItemClickListener{
//exist code
   @Override
   onItemClick(View view, int position){
       // Do something with view + position
   }
//


}

P.s:使用此解决方案,您可以在行中捕获多事件子视图:)

答案 1 :(得分:0)

我建议您将android:descendantFocusability="blocksDescendants"添加到xml文件中的root view

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    ...
    android:descendantFocusability="blocksDescendants">

    <Button
     ... 
       />
</RelativeLayout>

或者您可以使用ImageView代替ImageButton

答案 2 :(得分:0)

为什么使用imageButton,请改用imageView

答案 3 :(得分:0)

尝试在xml布局中添加 android:clickable =&#34; true&#34; ,这是一行充气。

答案 4 :(得分:0)

请在构造函数中找到imageButton xml视图和 在下面的FolderViewHolder构造函数中设置 ImageButton 单击侦听器。

public FolderViewHolder(View itemView) {
      super(itemView);
    imageButton=(ImageButton)itemView.findViewById(R.id.browser_bookmark_row_edit)
     imageButton.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
            System.out.println(" ######### EDIT CLICKED");
            mListener.switchToEditBookmarkFragmentFolderAdapter(bookmarks.get(getAdapterPosition()) - folders.size()));
      }
   });
}

答案 5 :(得分:0)

好的,发现了问题。因为我的循环视图还在片段本身中触摸了侦听器,所以他捕获了click事件。

答案 6 :(得分:0)

RecyclerView.OnItemTouchListeneronSingleTapUp()返回true。它应该是false。因此,执行将在onBindViewHolder()中的持有人视图中显示的单击事件。