android – RecyclerView:如何添加OnClick()并保持onLongClick()正常工作?

前端之家收集整理的这篇文章主要介绍了android – RecyclerView:如何添加OnClick()并保持onLongClick()正常工作?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在CheckBox上设置了一个onClickListener,用于包含CardView列表的RecyclerView.侦听器设置在扩展ViewHolder的ItemHolder中.初次单击CardView会检查CheckBox并将CardView的背景颜色从默认的白色切换为红色.这工作正常.

我还在CardView上设置了一个OnClickListener. OnClickListener是在onCreateViewHolder()中设置的.单击CardView会为CardView启动新的详细活动.这工作正常.

最后,我尝试在CardView上设置onLongClickListener. OnLongClickListener在onCreateViewHolder()中设置. CardView上的longpress意味着将背景颜色切换为红色并启动AlertDialog,以便用户可以确认将从列表中删除CardView.这可以正常工作,但是当此代码添加到适配器时,CardView的CheckBox的OnClickListerner不再有效.就好像OnLongClickListner与CheckBox监听器冲突一样.注意我在itemHolder的onLongClick()代码中“返回true”.我在这里想念的是什么?

Adapter.java

  1. public MyRecylerAdapter(Context context,ArrayList<ListItem> listItems,ArrayList<ListItem> selectedList) {
  2. this.mContext = context;
  3. this.mListItems = listItems;
  4. this.selectedItemsList = selectedList;
  5. }
  6.  
  7. private int selectedPos = -1;
  8. ...
  9.  
  10. private class ItemHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
  11.  
  12. private CardView cardView;
  13. private CheckBox chkSelected;
  14.  
  15. private ItemHolder(final View itemView) {
  16. super(itemView);
  17.  
  18. cardView = (CardView) itemView.findViewById(R.id.singlecard_view1);
  19. chkSelected = (CheckBox) itemView.findViewById(R.id.chkSelected);
  20. chkSelected.setOnClickListener(this);
  21. }
  22.  
  23. public void onClick(View v) {
  24.  
  25. int adapterPos = getAdapterPosition();
  26.  
  27. if (adapterPos == android.support.v7.widget.RecyclerView.NO_POSITION) return;
  28. if (recyclerItemClickListener !=null) {
  29. recyclerItemClickListener.onCheckBoxClick(v,adapterPos);
  30. }
  31. Integer iPos = adapterPos;
  32.  
  33. if (((CheckBox)v).isChecked()) {
  34. checkedListItems.add(iPos);
  35. }
  36. else {
  37. checkedListItems.remove(iPos);
  38. }
  39. }
  40.  
  41. void bind(int position) {
  42.  
  43. if (checkedListItems.contains(position)) {
  44. chkSelected.setChecked(true);
  45. }
  46. else {
  47. chkSelected.setChecked(false);
  48. }
  49. }
  50. }
  51.  
  52. @Override
  53. public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent,int viewType) {
  54.  
  55. View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_contact_item,parent,false);
  56. final ItemHolder itemHolder = new ItemHolder(view);
  57.  
  58. itemHolder.itemView.setOnClickListener(new View.OnClickListener() {
  59. // Handles the row being clicked.
  60. @Override
  61. public void onClick(View view) {
  62.  
  63. ListItem adapterItem = MyRecylerAdapter.this.getItem(itemHolder.getAdapterPosition());
  64.  
  65. if (recyclerItemClickListener != null) {
  66. recyclerItemClickListener.onItemClick(itemHolder.itemView,adapterItem);
  67. }
  68. }
  69. });
  70.  
  71. itemHolder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
  72. @Override
  73. public boolean onLongClick(View view) {
  74.  
  75. ListItem adapterItem2 = MyRecylerAdapter.this.getItem(itemHolder.getAdapterPosition());
  76.  
  77. if (recyclerItemClickListener != null) {
  78. recyclerItemClickListener.onItemLongClick(itemHolder.itemView,adapterItem2);
  79. }
  80.  
  81. int adapterPos2 = itemHolder.getAdapterPosition();
  82. if (adapterPos2 != android.support.v7.widget.RecyclerView.NO_POSITION) {
  83. int lastSelectedPosition = selectedPos;
  84. selectedPos = adapterPos2;
  85. notifyItemChanged(lastSelectedPosition);
  86. notifyItemChanged(selectedPos);
  87. }
  88. return true;
  89. }
  90. });
  91. return itemHolder;
  92. }
  93.  
  94. public void onBindViewHolder(final RecyclerView.ViewHolder holder,int position) {
  95.  
  96. final ListItem listItem = mListItems.get(position);
  97. final ItemHolder itemHolder = (ItemHolder) holder;
  98.  
  99. itemHolder.bind(position);
  100.  
  101. if (checkedListItems.contains(position)) {
  102. itemHolder.cardView.setActivated(true);
  103. }
  104. else {
  105. itemHolder.cardView.setActivated(false);
  106. }
  107.  
  108. // **The addition of the below code causes the "itemHolder.cardView.
  109. // setActivated(true);" in onBindViewHolder method to no longer fire,as
  110. // a click on the CheckBox no longer changes the CardView background
  111. // color.**
  112. if (itemHolder.getAdapterPosition() == selectedPos) {
  113. itemHolder.cardView.setActivated(true);
  114. } else {
  115. itemHolder.cardView.setActivated(false);
  116. }

list_contact_item.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2.  
  3. <android.support.v7.widget.CardView
  4. xmlns:card_view="http://schemas.android.com/apk/res-auto"
  5. xmlns:android="http://schemas.android.com/apk/res/android"
  6. android:id="@+id/singlecard_view1"
  7. android:layout_width="match_parent"
  8. android:layout_height="wrap_content"
  9. android:foreground="?android:attr/selectableItemBackground"
  10. >
  11.  
  12. <RelativeLayout
  13. android:layout_width="match_parent"
  14. android:layout_height="match_parent"
  15. android:background="@drawable/statelist_cardview_background" >
  16.  
  17. <CheckBox
  18. android:id="@+id/chkSelected"
  19. android:layout_width="wrap_content"
  20. android:layout_height="30dp"
  21. android:layout_alignParentTop="true"
  22. android:layout_alignParentStart="true"
  23. android:layout_alignParentLeft="true"
  24. android:layout_marginLeft="4dp"
  25. android:layout_marginStart="4dp"
  26. android:layout_marginTop="4dp"
  27. android:gravity="center" />
  28.  
  29. <TextView
  30. android:id="@+id/cardType1"
  31. android:layout_width="wrap_content"
  32. android:layout_height="30dp"
  33. android:layout_toRightOf="@+id/chkSelected"
  34. android:layout_toEndOf="@+id/chkSelected"
  35. android:layout_alignParentTop="true"
  36. android:paddingStart="3dp"
  37. android:paddingLeft="3dp"
  38. android:paddingEnd="6dp"
  39. android:paddingRight="6dp"
  40. android:layout_marginTop="4dp"
  41. android:gravity="center"
  42. android:textColor="#ffffff"
  43. android:textStyle="bold|italic"
  44. style="@style/Base.TextAppearance.AppCompat.Subhead" />
  45.  
  46. <TextView
  47. android:id="@+id/cardBlankText1"
  48. android:layout_width="wrap_content"
  49. android:layout_height="30dp"
  50. android:layout_alignParentTop="true"
  51. android:layout_toRightOf="@+id/cardType1"
  52. android:layout_toEndOf="@+id/cardType1"
  53. android:layout_toLeftOf="@+id/cardBlankTextNumstotal"
  54. android:layout_toStartOf="@+id/cardBlankTextNumstotal"
  55. android:layout_marginTop="4dp"
  56. android:gravity="center_vertical|end"
  57. android:text="#"
  58. android:textColor="@color/colorFlLabelFinal"
  59. android:textStyle="bold"
  60. android:maxLines="1"
  61. style="@style/Base.TextAppearance.AppCompat.Subhead" />
  62.  
  63. <TextView
  64. android:id="@+id/cardBlankTextNumstotal"
  65. android:layout_width="wrap_content"
  66. android:layout_height="30dp"
  67. android:layout_alignParentTop="true"
  68. android:layout_alignParentEnd="true"
  69. android:layout_alignParentRight="true"
  70. android:gravity="center"
  71. android:text="actual card #"
  72. android:layout_marginTop="4dp"
  73. android:layout_marginRight="4dp"
  74. android:layout_marginEnd="4dp"
  75. android:freezesText="true"
  76. android:textColor="@android:color/black"
  77. android:maxLines="1"
  78. style="@style/Base.TextAppearance.AppCompat.Subhead" />
  79.  
  80. <TextView
  81. android:id="@+id/cardBlankText2"
  82. android:layout_width="wrap_content"
  83. android:layout_height="wrap_content"
  84. android:layout_alignParentLeft="true"
  85. android:layout_alignParentStart="true"
  86. android:layout_below="@+id/chkSelected"
  87. android:layout_marginTop="4dp"
  88. android:layout_marginLeft="6dp"
  89. android:layout_marginStart="6dp"
  90. android:text="todo"
  91. android:textColor="@android:color/black"
  92. android:textStyle="bold"
  93. android:background="@drawable/todo_underline"
  94. android:maxLines="1"
  95. style="@style/Base.TextAppearance.AppCompat.Headline" />
  96.  
  97. ...
  98. </RelativeLayout>
  99.  
  100. </android.support.v7.widget.CardView>

statelist_cardview_background.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <selector xmlns:android="http://schemas.android.com/apk/res/android">
  3.  
  4. <item android:state_activated="true"
  5.  
  6. android:drawable="@color/item_selected" />
  7.  
  8. <item android:state_activated="false"
  9.  
  10. android:drawable="@color/list_contact_item_default" />
  11.  
  12. </selector>

colors.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <resources>
  3.  
  4. <color name="list_contact_item_default">#FFFFFF</color>
  5. <color name="item_selected">#FF0000</color>
  6.  
  7. </resources>

解决方法

看来你在这里试图解决错误的问题.你不应该设置click&长时间点击卡片视图本身的监听器.

>您可以在复选框上具有单击侦听器或checkedChangeListener
>点击&长时间点击监听器可以在view_container的其余部分

这里,如果你想点击view_container选中/取消选中复选框,你可以在view_container的onClick监听器中轻松完成.

编辑:
我已经更新了你的布局文件,现在注意你在FrameLayout上作为RelativeLayout(view_container)&的父级.复选框.

由于CheckBox是在RelativeLayout之后添加的,因此它将在view_container之上显示.希望它对你有用.

现在您可以设置单击侦听器,如上所述.

更新了布局文件

  1. <?xml version="1.0" encoding="utf-8"?>
  2.  
  3. <android.support.v7.widget.CardView
  4. xmlns:card_view="http://schemas.android.com/apk/res-auto"
  5. xmlns:android="http://schemas.android.com/apk/res/android"
  6. android:id="@+id/singlecard_view1"
  7. android:layout_width="match_parent"
  8. android:layout_height="wrap_content"
  9. android:foreground="?android:attr/selectableItemBackground"
  10. >
  11. <FrameLayout
  12. android:layout_width="match_parent"
  13. android:layout_height="match_parent">
  14.  
  15. <RelativeLayout
  16. android:id="@+id/view_container"
  17. android:layout_width="match_parent"
  18. android:layout_height="match_parent"
  19. android:background="@drawable/statelist_cardview_background" >
  20.  
  21.  
  22. <TextView
  23. android:id="@+id/cardType1"
  24. android:layout_width="wrap_content"
  25. android:layout_height="30dp"
  26. android:layout_marginLeft="30dp"
  27. android:layout_marginStart="30dp"
  28. android:layout_alignParentTop="true"
  29. android:paddingStart="3dp"
  30. android:paddingLeft="3dp"
  31. android:paddingEnd="6dp"
  32. android:paddingRight="6dp"
  33. android:layout_marginTop="4dp"
  34. android:gravity="center"
  35. android:textColor="#ffffff"
  36. android:textStyle="bold|italic"
  37. style="@style/Base.TextAppearance.AppCompat.Subhead" />
  38.  
  39. <TextView
  40. android:id="@+id/cardBlankText1"
  41. android:layout_width="wrap_content"
  42. android:layout_height="30dp"
  43. android:layout_alignParentTop="true"
  44. android:layout_toRightOf="@+id/cardType1"
  45. android:layout_toEndOf="@+id/cardType1"
  46. android:layout_toLeftOf="@+id/cardBlankTextNumstotal"
  47. android:layout_toStartOf="@+id/cardBlankTextNumstotal"
  48. android:layout_marginTop="4dp"
  49. android:gravity="center_vertical|end"
  50. android:text="#"
  51. android:textColor="@color/colorFlLabelFinal"
  52. android:textStyle="bold"
  53. android:maxLines="1"
  54. style="@style/Base.TextAppearance.AppCompat.Subhead" />
  55.  
  56. <TextView
  57. android:id="@+id/cardBlankTextNumstotal"
  58. android:layout_width="wrap_content"
  59. android:layout_height="30dp"
  60. android:layout_alignParentTop="true"
  61. android:layout_alignParentEnd="true"
  62. android:layout_alignParentRight="true"
  63. android:gravity="center"
  64. android:text="actual card #"
  65. android:layout_marginTop="4dp"
  66. android:layout_marginRight="4dp"
  67. android:layout_marginEnd="4dp"
  68. android:freezesText="true"
  69. android:textColor="@android:color/black"
  70. android:maxLines="1"
  71. style="@style/Base.TextAppearance.AppCompat.Subhead" />
  72.  
  73. <TextView
  74. android:id="@+id/cardBlankText2"
  75. android:layout_width="wrap_content"
  76. android:layout_height="wrap_content"
  77. android:layout_alignParentLeft="true"
  78. android:layout_alignParentStart="true"
  79. android:layout_marginTop="34dp"
  80. android:layout_marginLeft="6dp"
  81. android:layout_marginStart="6dp"
  82. android:text="todo"
  83. android:textColor="@android:color/black"
  84. android:textStyle="bold"
  85. android:background="@drawable/todo_underline"
  86. android:maxLines="1"
  87. style="@style/Base.TextAppearance.AppCompat.Headline" />
  88.  
  89. ...
  90. </RelativeLayout>
  91. <CheckBox
  92. android:id="@+id/chkSelected"
  93. android:layout_width="wrap_content"
  94. android:layout_height="30dp"
  95. android:layout_alignParentTop="true"
  96. android:layout_alignParentStart="true"
  97. android:layout_alignParentLeft="true"
  98. android:layout_marginLeft="4dp"
  99. android:layout_marginStart="4dp"
  100. android:layout_marginTop="4dp"
  101. android:gravity="center" />
  102.  
  103. </FrameLayout>
  104.  
  105.  
  106. </android.support.v7.widget.CardView>

猜你在找的Android相关文章