如何正确地强调选择项目RecyclerView? [英] How to properly highlight selected item on 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屋!