我还在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>