AJW*_*AJW 7 checkbox android android-recyclerview
我有onClickListener一个CheckBox用于RecyclerView保存CardView列表的设置.在我的ItemHolder扩展中设置了监听器ViewHolder.初始点击CardView检查CheckBox并将CardView的背景颜色从默认的白色切换为红色.这工作正常.
我也有自己的OnClickListener设置CardView.它OnClickListener是在onCreateViewHolder().中设置的.单击将CardView启动新的详细活动CardView.这工作正常.
最后,我尝试onLongClickListener在CardView上设置一个.该OnLongClickListener设置在onCreateViewHolder().CardView上的longpress意味着将背景颜色切换为红色并启动AlertDialog,以便用户可以确认将从列表中删除CardView.这可以正常工作,但是当这个代码添加到适配器时OnClickListerner,CardView的CheckBox不再有效.就好像它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);
}
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
看来你在这里试图解决错误的问题。您不应在卡片视图本身上设置单击和长按侦听器。
在这里,如果您想在单击view_container 时选中/取消选中复选框,您可以在 view_container 的onClick侦听器中轻松完成此操作。
编辑:我已经更新了您的布局文件,请注意现在您已将 FrameLayout 作为relativelayout(view_container)和复选框的父级。
由于复选框是在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>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1714 次 |
| 最近记录: |