我还在CardView上设置了一个OnClickListener. OnClickListener是在onCreateViewHolder()中设置的.单击CardView会为CardView启动新的详细活动.这工作正常.
最后,我尝试在CardView上设置onLongClickListener. OnLongClickListener在onCreateViewHolder()中设置. CardView上的longpress意味着将背景颜色切换为红色并启动AlertDialog,以便用户可以确认将从列表中删除CardView.这可以正常工作,但是当此代码添加到适配器时,CardView的CheckBox的OnClickListerner不再有效.就好像OnLongClickListner与CheckBox监听器冲突一样.注意我在itemHolder的onLongClick()代码中“返回true”.我在这里想念的是什么?
Adapter.java
public MyRecylerAdapter(Context context,ArrayList<ListItem> listItems,ArrayList<ListItem> selectedList) { this.mContext = context; this.mListItems = listItems; this.selectedItemsList = selectedList; } private int selectedPos = -1; ... private class ItemHolder extends RecyclerView.ViewHolder implements View.OnClickListener { private CardView cardView; private CheckBox chkSelected; private ItemHolder(final View itemView) { super(itemView); cardView = (CardView) itemView.findViewById(R.id.singlecard_view1); chkSelected = (CheckBox) itemView.findViewById(R.id.chkSelected); chkSelected.setOnClickListener(this); } public void onClick(View v) { int adapterPos = getAdapterPosition(); if (adapterPos == android.support.v7.widget.RecyclerView.NO_POSITION) return; if (recyclerItemClickListener !=null) { recyclerItemClickListener.onCheckBoxClick(v,adapterPos); } Integer iPos = adapterPos; if (((CheckBox)v).isChecked()) { checkedListItems.add(iPos); } else { checkedListItems.remove(iPos); } } void bind(int position) { if (checkedListItems.contains(position)) { chkSelected.setChecked(true); } else { chkSelected.setChecked(false); } } } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent,int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_contact_item,parent,false); final ItemHolder itemHolder = new ItemHolder(view); itemHolder.itemView.setOnClickListener(new View.OnClickListener() { // Handles the row being clicked. @Override public void onClick(View view) { ListItem adapterItem = MyRecylerAdapter.this.getItem(itemHolder.getAdapterPosition()); if (recyclerItemClickListener != null) { recyclerItemClickListener.onItemClick(itemHolder.itemView,adapterItem); } } }); itemHolder.itemView.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View view) { ListItem adapterItem2 = MyRecylerAdapter.this.getItem(itemHolder.getAdapterPosition()); if (recyclerItemClickListener != null) { recyclerItemClickListener.onItemLongClick(itemHolder.itemView,adapterItem2); } int adapterPos2 = itemHolder.getAdapterPosition(); if (adapterPos2 != android.support.v7.widget.RecyclerView.NO_POSITION) { int lastSelectedPosition = selectedPos; selectedPos = adapterPos2; notifyItemChanged(lastSelectedPosition); notifyItemChanged(selectedPos); } return true; } }); return itemHolder; } public void onBindViewHolder(final RecyclerView.ViewHolder holder,int position) { final ListItem listItem = mListItems.get(position); final ItemHolder itemHolder = (ItemHolder) holder; itemHolder.bind(position); if (checkedListItems.contains(position)) { itemHolder.cardView.setActivated(true); } else { itemHolder.cardView.setActivated(false); } // **The addition of the below code causes the "itemHolder.cardView. // setActivated(true);" in onBindViewHolder method to no longer fire,as // a click on the CheckBox no longer changes the CardView background // color.** if (itemHolder.getAdapterPosition() == selectedPos) { itemHolder.cardView.setActivated(true); } else { itemHolder.cardView.setActivated(false); }
list_contact_item.xml
<?xml version="1.0" encoding="utf-8"?> <android.support.v7.widget.CardView xmlns:card_view="http://schemas.android.com/apk/res-auto" xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/singlecard_view1" android:layout_width="match_parent" android:layout_height="wrap_content" android:foreground="?android:attr/selectableItemBackground" > <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/statelist_cardview_background" > <CheckBox android:id="@+id/chkSelected" android:layout_width="wrap_content" android:layout_height="30dp" android:layout_alignParentTop="true" android:layout_alignParentStart="true" android:layout_alignParentLeft="true" android:layout_marginLeft="4dp" android:layout_marginStart="4dp" android:layout_marginTop="4dp" android:gravity="center" /> <TextView android:id="@+id/cardType1" android:layout_width="wrap_content" android:layout_height="30dp" android:layout_toRightOf="@+id/chkSelected" android:layout_toEndOf="@+id/chkSelected" android:layout_alignParentTop="true" android:paddingStart="3dp" android:paddingLeft="3dp" android:paddingEnd="6dp" android:paddingRight="6dp" android:layout_marginTop="4dp" android:gravity="center" android:textColor="#ffffff" android:textStyle="bold|italic" style="@style/Base.TextAppearance.AppCompat.Subhead" /> <TextView android:id="@+id/cardBlankText1" android:layout_width="wrap_content" android:layout_height="30dp" android:layout_alignParentTop="true" android:layout_toRightOf="@+id/cardType1" android:layout_toEndOf="@+id/cardType1" android:layout_toLeftOf="@+id/cardBlankTextNumstotal" android:layout_toStartOf="@+id/cardBlankTextNumstotal" android:layout_marginTop="4dp" android:gravity="center_vertical|end" android:text="#" android:textColor="@color/colorFlLabelFinal" android:textStyle="bold" android:maxLines="1" style="@style/Base.TextAppearance.AppCompat.Subhead" /> <TextView android:id="@+id/cardBlankTextNumstotal" android:layout_width="wrap_content" android:layout_height="30dp" android:layout_alignParentTop="true" android:layout_alignParentEnd="true" android:layout_alignParentRight="true" android:gravity="center" android:text="actual card #" android:layout_marginTop="4dp" android:layout_marginRight="4dp" android:layout_marginEnd="4dp" android:freezesText="true" android:textColor="@android:color/black" android:maxLines="1" style="@style/Base.TextAppearance.AppCompat.Subhead" /> <TextView android:id="@+id/cardBlankText2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_below="@+id/chkSelected" android:layout_marginTop="4dp" android:layout_marginLeft="6dp" android:layout_marginStart="6dp" android:text="todo" android:textColor="@android:color/black" android:textStyle="bold" android:background="@drawable/todo_underline" android:maxLines="1" style="@style/Base.TextAppearance.AppCompat.Headline" /> ... </RelativeLayout> </android.support.v7.widget.CardView>
statelist_cardview_background.xml
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_activated="true" android:drawable="@color/item_selected" /> <item android:state_activated="false" android:drawable="@color/list_contact_item_default" /> </selector>
colors.xml
<?xml version="1.0" encoding="utf-8"?> <resources> <color name="list_contact_item_default">#FFFFFF</color> <color name="item_selected">#FF0000</color> </resources>
解决方法
>您可以在复选框上具有单击侦听器或checkedChangeListener
>点击&长时间点击监听器可以在view_container的其余部分
这里,如果你想点击view_container选中/取消选中复选框,你可以在view_container的onClick监听器中轻松完成.
编辑:
我已经更新了你的布局文件,现在注意你在FrameLayout上作为RelativeLayout(view_container)&的父级.复选框.
由于CheckBox是在RelativeLayout之后添加的,因此它将在view_container之上显示.希望它对你有用.
现在您可以设置单击侦听器,如上所述.
更新了布局文件
<?xml version="1.0" encoding="utf-8"?> <android.support.v7.widget.CardView xmlns:card_view="http://schemas.android.com/apk/res-auto" xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/singlecard_view1" android:layout_width="match_parent" android:layout_height="wrap_content" android:foreground="?android:attr/selectableItemBackground" > <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent"> <RelativeLayout android:id="@+id/view_container" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/statelist_cardview_background" > <TextView android:id="@+id/cardType1" android:layout_width="wrap_content" android:layout_height="30dp" android:layout_marginLeft="30dp" android:layout_marginStart="30dp" android:layout_alignParentTop="true" android:paddingStart="3dp" android:paddingLeft="3dp" android:paddingEnd="6dp" android:paddingRight="6dp" android:layout_marginTop="4dp" android:gravity="center" android:textColor="#ffffff" android:textStyle="bold|italic" style="@style/Base.TextAppearance.AppCompat.Subhead" /> <TextView android:id="@+id/cardBlankText1" android:layout_width="wrap_content" android:layout_height="30dp" android:layout_alignParentTop="true" android:layout_toRightOf="@+id/cardType1" android:layout_toEndOf="@+id/cardType1" android:layout_toLeftOf="@+id/cardBlankTextNumstotal" android:layout_toStartOf="@+id/cardBlankTextNumstotal" android:layout_marginTop="4dp" android:gravity="center_vertical|end" android:text="#" android:textColor="@color/colorFlLabelFinal" android:textStyle="bold" android:maxLines="1" style="@style/Base.TextAppearance.AppCompat.Subhead" /> <TextView android:id="@+id/cardBlankTextNumstotal" android:layout_width="wrap_content" android:layout_height="30dp" android:layout_alignParentTop="true" android:layout_alignParentEnd="true" android:layout_alignParentRight="true" android:gravity="center" android:text="actual card #" android:layout_marginTop="4dp" android:layout_marginRight="4dp" android:layout_marginEnd="4dp" android:freezesText="true" android:textColor="@android:color/black" android:maxLines="1" style="@style/Base.TextAppearance.AppCompat.Subhead" /> <TextView android:id="@+id/cardBlankText2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_marginTop="34dp" android:layout_marginLeft="6dp" android:layout_marginStart="6dp" android:text="todo" android:textColor="@android:color/black" android:textStyle="bold" android:background="@drawable/todo_underline" android:maxLines="1" style="@style/Base.TextAppearance.AppCompat.Headline" /> ... </RelativeLayout> <CheckBox android:id="@+id/chkSelected" android:layout_width="wrap_content" android:layout_height="30dp" android:layout_alignParentTop="true" android:layout_alignParentStart="true" android:layout_alignParentLeft="true" android:layout_marginLeft="4dp" android:layout_marginStart="4dp" android:layout_marginTop="4dp" android:gravity="center" /> </FrameLayout> </android.support.v7.widget.CardView>