如何正确地强调选择项目RecyclerView? [英] How to properly highlight selected item on RecyclerView?

查看:260
本文介绍了如何正确地强调选择项目RecyclerView?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想使用RecyclerView卧式列表视图。我试图找出如何突出选择的项目。当我点击的项目之一,它被选中并正确highlited但是当我点击另一个第二个被用,哥哥突出。

下面是我的onClick功能:

  @覆盖
    公共无效的onClick(视图查看){

        如果(selectedListItem!= NULL){
             Log.d(TAG,selectedListItem+为getPosition()++项目);
            selectedListItem.setBackgroundColor(Color.RED);
        }
        Log.d(TAG的onClick+为getPosition()++项目);
        viewHolderListener.onIndexChanged(为getPosition());
        selectedPosition =为getPosition();
        view.setBackgroundColor(Color.CYAN);
        selectedListItem =图。
    }
 

下面是onBindViewHolder:

  @覆盖
公共无效onBindViewHolder(ViewHolder viewHolder,INT位置){
    viewHolder.setItem(fruitsData [位置]);
    如果(selectedPosition ==位置)
        viewHolder.itemView.setBackgroundColor(Color.CYAN);
    其他
        viewHolder.itemView.setBackgroundColor(Color.RED);

}
 

解决方案

我写了一个基本适配器类来自动处理项目选择了RecyclerView。只是从中获得您的适配器,并使用可绘制状态列表与state_selected,就像你要做一个列表视图做。

我有一个博客张贴在这里有关,但这里是code:

 公共抽象类TrackSelectionAdapter< VH延伸TrackSelectionAdapter.ViewHolder>扩展RecyclerView.Adapter< VH> {
    //开始与选定的第一个项目
    私人诠释focusedItem = 0;

    @覆盖
    公共无效onAttachedToRecyclerView(最终RecyclerView recyclerView){
        super.onAttachedToRecyclerView(recyclerView);

        //手柄键和键并试图移动选择
        recyclerView.setOnKeyListener(新View.OnKeyListener(){
            @覆盖
            公共布尔onKey(视图V,INT关键code,KeyEvent的事件){
                RecyclerView.LayoutManager LM = recyclerView.getLayoutManager();

                //返回false,如果滚动到的范围,让焦点移出列表
                如果(event.getAction()== KeyEvent.ACTION_DOWN){
                    如果(键code == KeyEvent.KEY code_DPAD_DOWN){
                        返回tryMoveSelection(流明,1);
                    }否则,如果(键code == KeyEvent.KEY code_DPAD_UP){
                        返回tryMoveSelection(流明,-1);
                    }
                }

                返回false;
            }
        });
    }

    私人布尔tryMoveSelection(RecyclerView.LayoutManager流明,INT方向){
        INT tryFocusItem = focusedItem +方向;

        //如果仍然有效的范围内,移动选择,通知重绘,和滚动
        如果(tryFocusItem> = 0&安培;&安培; tryFocusItem&其中; getItemCount()){
            notifyItemChanged(focusedItem);
            focusedItem = tryFocusItem;
            notifyItemChanged(focusedItem);
            lm.scrollToPosition(focusedItem);
            返回true;
        }

        返回false;
    }

    @覆盖
    公共无效onBindViewHolder(VH viewHolder,int i)以{
        //设置选中状态;使用状态列表绘制样式视图
        viewHolder.itemView.setSelected(focusedItem == I);
    }

    公共类ViewHolder扩展RecyclerView.ViewHolder {
        公共ViewHolder(查看ItemView控件){
            超(ItemView控件);

            //处理项目的点击和设置选择
            itemView.setOnClickListener(新View.OnClickListener(){
                @覆盖
                公共无效的onClick(视图v){
                    //重绘旧的选择和新的
                    notifyItemChanged(focusedItem);
                    focusedItem = getLayoutPosition();
                    notifyItemChanged(focusedItem);
                }
            });
        }
    }
}
 

I am trying to use RecyclerView as horizontal listview. I am trying to figure out how to highlight selected item. When i click one of the item, it gets selected and it is highlited properly but when i click another one second one gets highlighted with the older one.

Here is my onClick function:

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

Here is 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);

}

解决方案

I wrote a base adapter class to automatically handle item selection with a RecyclerView. Just derive your adapter from it and use drawable state lists with state_selected, like you would do with a list view.

I have a Blog Post Here about it, but here is the code:

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

这篇关于如何正确地强调选择项目RecyclerView?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆