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

我正在尝试使用a RecyclerView作为水平ListView。我试图弄清楚如何突出显示所选项目。当我单击其中一项时,它会被选中并正确突出显示,但是当我单击另一项时,第二项将与较旧的一起突出显示。


这是我的onClick函数:


@Override

public 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:


@Override

public void onBindViewHolder(ViewHolder viewHolder, int position) {   

    viewHolder.setItem(fruitsData[position]);

    if(selectedPosition == position)

        viewHolder.itemView.setBackgroundColor(Color.CYAN);    

    else

        viewHolder.itemView.setBackgroundColor(Color.RED);


}


至尊宝的传说
浏览 752回答 3
3回答

萧十郎

我编写了一个基本适配器类,以使用RecyclerView自动处理项目选择。只需从它派生适配器,并使用带有state_selected的可绘制状态列表,就像使用列表视图一样。我在这里有一篇博客文章,但这是代码:public abstract class TrackSelectionAdapter<VH extends TrackSelectionAdapter.ViewHolder> extends RecyclerView.Adapter<VH> {&nbsp; &nbsp; // Start with first item selected&nbsp; &nbsp; private int focusedItem = 0;&nbsp; &nbsp; @Override&nbsp; &nbsp; public void onAttachedToRecyclerView(final RecyclerView recyclerView) {&nbsp; &nbsp; &nbsp; &nbsp; super.onAttachedToRecyclerView(recyclerView);&nbsp; &nbsp; &nbsp; &nbsp; // Handle key up and key down and attempt to move selection&nbsp; &nbsp; &nbsp; &nbsp; recyclerView.setOnKeyListener(new View.OnKeyListener() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public boolean onKey(View v, int keyCode, KeyEvent event) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; RecyclerView.LayoutManager lm = recyclerView.getLayoutManager();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Return false if scrolled to the bounds and allow focus to move off the list&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (event.getAction() == KeyEvent.ACTION_DOWN) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return tryMoveSelection(lm, 1);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else if (keyCode == KeyEvent.KEYCODE_DPAD_UP) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return tryMoveSelection(lm, -1);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return false;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; });&nbsp; &nbsp; }&nbsp; &nbsp; private boolean tryMoveSelection(RecyclerView.LayoutManager lm, int direction) {&nbsp; &nbsp; &nbsp; &nbsp; int tryFocusItem = focusedItem + direction;&nbsp; &nbsp; &nbsp; &nbsp; // If still within valid bounds, move the selection, notify to redraw, and scroll&nbsp; &nbsp; &nbsp; &nbsp; if (tryFocusItem >= 0 && tryFocusItem < getItemCount()) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; notifyItemChanged(focusedItem);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; focusedItem = tryFocusItem;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; notifyItemChanged(focusedItem);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lm.scrollToPosition(focusedItem);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return true;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; return false;&nbsp; &nbsp; }&nbsp; &nbsp; @Override&nbsp; &nbsp; public void onBindViewHolder(VH viewHolder, int i) {&nbsp; &nbsp; &nbsp; &nbsp; // Set selected state; use a state list drawable to style the view&nbsp; &nbsp; &nbsp; &nbsp; viewHolder.itemView.setSelected(focusedItem == i);&nbsp; &nbsp; }&nbsp; &nbsp; public class ViewHolder extends RecyclerView.ViewHolder {&nbsp; &nbsp; &nbsp; &nbsp; public ViewHolder(View itemView) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; super(itemView);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Handle item click and set the selection&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; itemView.setOnClickListener(new View.OnClickListener() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public void onClick(View v) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Redraw the old selection and the new&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; notifyItemChanged(focusedItem);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; focusedItem = getLayoutPosition();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; notifyItemChanged(focusedItem);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; });&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}&nbsp;
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Android