在RecyclerView中突出显示CardView行

时间:2016-08-17 13:33:39

标签: android android-recyclerview

我正在关注RecyclerView上的Big Nerd Ranch tutorial on RecyclerView教程。我改变了一些东西。我面临的问题是,当我点击该行时;该特定内容突出显示,但后来我无法看到其他未选择的行'。

选择行之前: enter image description here

选择行enter image description here

我正在持有人中实现点击次数。 以下是代码:

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;
        }
    }

2 个答案:

答案 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