为了账号安全,请及时绑定邮箱和手机立即绑定

如何在RecyclerView上正确突出显示所选项目?

如何在RecyclerView上正确突出显示所选项目?

至尊宝的传说 2019-10-06 11:23:01
我正在尝试使用a RecyclerView作为水平ListView。我试图弄清楚如何突出显示所选项目。当我单击其中一项时,它会被选中并正确突出显示,但是当我单击另一项时,第二项将与较旧的一起突出显示。这是我的onClick函数:@Overridepublic void onClick(View view) {    if(selectedListItem!=null){        Log.d(TAG, "selectedListItem " + getPosition() + " " + item);        selectedListItem.setBackgroundColor(Color.RED);    }    Log.d(TAG, "onClick " + getPosition() + " " + item);    viewHolderListener.onIndexChanged(getPosition());    selectedPosition = getPosition();    view.setBackgroundColor(Color.CYAN);     selectedListItem = view;}这是onBindViewHolder:@Overridepublic void onBindViewHolder(ViewHolder viewHolder, int position) {       viewHolder.setItem(fruitsData[position]);    if(selectedPosition == position)        viewHolder.itemView.setBackgroundColor(Color.CYAN);        else        viewHolder.itemView.setBackgroundColor(Color.RED);}
查看完整描述

3 回答

?
萧十郎

TA贡献1815条经验 获得超13个赞

我编写了一个基本适配器类,以使用RecyclerView自动处理项目选择。只需从它派生适配器,并使用带有state_selected的可绘制状态列表,就像使用列表视图一样。


我在这里有一篇博客文章,但这是代码:


public abstract class TrackSelectionAdapter<VH extends TrackSelectionAdapter.ViewHolder> extends RecyclerView.Adapter<VH> {

    // Start with first item selected

    private int focusedItem = 0;


    @Override

    public void onAttachedToRecyclerView(final RecyclerView recyclerView) {

        super.onAttachedToRecyclerView(recyclerView);


        // Handle key up and key down and attempt to move selection

        recyclerView.setOnKeyListener(new View.OnKeyListener() {

            @Override

            public boolean onKey(View v, int keyCode, KeyEvent event) {

                RecyclerView.LayoutManager lm = recyclerView.getLayoutManager();


                // Return false if scrolled to the bounds and allow focus to move off the list

                if (event.getAction() == KeyEvent.ACTION_DOWN) {

                    if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN) {

                        return tryMoveSelection(lm, 1);

                    } else if (keyCode == KeyEvent.KEYCODE_DPAD_UP) {

                        return tryMoveSelection(lm, -1);

                    }

                }


                return false;

            }

        });

    }


    private boolean tryMoveSelection(RecyclerView.LayoutManager lm, int direction) {

        int tryFocusItem = focusedItem + direction;


        // If still within valid bounds, move the selection, notify to redraw, and scroll

        if (tryFocusItem >= 0 && tryFocusItem < getItemCount()) {

            notifyItemChanged(focusedItem);

            focusedItem = tryFocusItem;

            notifyItemChanged(focusedItem);

            lm.scrollToPosition(focusedItem);

            return true;

        }


        return false;

    }


    @Override

    public void onBindViewHolder(VH viewHolder, int i) {

        // Set selected state; use a state list drawable to style the view

        viewHolder.itemView.setSelected(focusedItem == i);

    }


    public class ViewHolder extends RecyclerView.ViewHolder {

        public ViewHolder(View itemView) {

            super(itemView);


            // Handle item click and set the selection

            itemView.setOnClickListener(new View.OnClickListener() {

                @Override

                public void onClick(View v) {

                    // Redraw the old selection and the new

                    notifyItemChanged(focusedItem);

                    focusedItem = getLayoutPosition();

                    notifyItemChanged(focusedItem);

                }

            });

        }

    }


查看完整回答
反对 回复 2019-10-06
  • 3 回答
  • 0 关注
  • 751 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信