我正在关注RecyclerView上的Big Nerd Ranch tutorial on RecyclerView教程。我改变了一些东西。我面临的问题是,当我点击该行时;该特定内容突出显示,但后来我无法看到其他未选择的行'。
我正在持有人中实现点击次数。 以下是代码:
public class CustomRecyclerViewHolder extends SwappingHolder implements View.OnClickListener, View.OnLongClickListener {
private TextView mMsg1, mMsg2;
//private ImageView mAvatarView;
private CheckBox mCheckBox;
private LinearLayout checkboxHolder;
private ImageView mDeleteRow;
private CardView cardView;
private Category category;
private CustomRecyclerViewHolder holder;
public CustomRecyclerViewHolder(View itemView) {
super(itemView, myFragment.mMultiSelector);
mMsg1 = (TextView) itemView.findViewById(R.id.text_view1);
mMsg2 = (TextView) itemView.findViewById(R.id.text_view2);
//mAvatarView = (ImageView)itemView.findViewById(R.id.avatar_holder);
mCheckBox = (CheckBox) itemView.findViewById(R.id.checkbox);
checkboxHolder = (LinearLayout) itemView.findViewById(R.id.checkbox_holder);
mDeleteRow = (ImageView) itemView.findViewById(R.id.delete_row);
cardView = (CardView) itemView.findViewById(R.id.card_holder);
itemView.setOnClickListener(this);
itemView.setLongClickable(true);
itemView.setOnLongClickListener(this);
}
public void bindCategory(Category category) {
this.category = category;
mMsg1.setText(category.getName());
mMsg2.setText(category.getDescriptionName());
if (category.getCompleted() == 1) {
mCheckBox.setChecked(true);
mCheckBox.setVisibility(View.VISIBLE);
} else
mCheckBox.setChecked(true);
}
@Override
public void onClick(View v) {
if (category == null) {
return;
}
checkboxHolder.setVisibility(View.VISIBLE);
mCheckBox.setChecked(isChecked);
if (!myFragment.mMultiSelector.tapSelection(this)) {
//selectCrime(mCrime);
}
}
@Override
public boolean onLongClick(View v) {
((AppCompatActivity) mContext).startSupportActionMode(myFragment.mDeleteMode);
myFragment.mMultiSelector.setSelected(this, true);
return true;
}
}
然后在我的片段中我这样做:
public class CustomMultiSelectorCallback extends ModalMultiSelectorCallback {
public CustomMultiSelectorCallback(MultiSelector multiSelector) {
super(multiSelector);
}
@Override
public boolean onCreateActionMode(ActionMode actionMode, Menu menu) {
super.onCreateActionMode(actionMode, menu);
actionMode.getMenuInflater().inflate(R.menu.list_item_delete, menu);
return true;
}
@Override
public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) {
switch (menuItem.getItemId()) {
case R.id.menu_item_delete:
{
for (int i = categoriesArrayList.size(); i >= 0; i--) {
if (mMultiSelector.isSelected(i, 0)) {
categoryDatabase = new CategoryDatabase(context);
Category category = prescriptionsArrayList.get(i);
categoryDatabase.deleteCategory(category);
categoryRecyclerView.getAdapter().notifyItemRemoved(i);
}
}
categoriesArrayList.clear();
mMultiSelector.clearSelections();
actionMode.finish();
return true;
}
}
return false;
}
}
答案 0 :(得分:0)
经过大量的研究,我终于找到了答案。如果您使用的是CardView + Big Nerd Ranch MultiSelector。当您通过单击它突出显示CardView时,只能看到该特定卡,而不是RecyclerView中的其余卡。这是因为SwappingHolder通过交换顶级View的drawable来工作。但是CardView使用自己的drawable,因此如果你将它用作顶级View,它将无法工作。
CardView使用自己的背景。 SwappingHolder需要能够替换该背景来完成其工作。
一种选择是自己实现SelectableHolder界面,并选择显示所选项目的方式。
另一个选择是我们可以制作FrameLayout的CardView子级。像这样的东西:
<FrameLayout
...
>
<CardView
...
>
</CardView>
</FrameLayout>
我总结了基本上说here
的内容答案 1 :(得分:0)
我邀请您查看我最近编写的一个实现多选的库(拖放和滑动,如果您最终需要它们)。在库的一个样本上,还通过在ViewHolder上放置一个drawable来实现选择。但是,使用的方法是在ActionMode启动时激活drawable,捕获此drawable上的click事件以切换选择状态,然后在ActionMode退出时将drawable visibility设置为GONE。
也许通过查看源代码,您可以找到感兴趣的内容:https://github.com/MikiLoz92/FancyAdapters