我正在使用下面的RecyclerView
:
<android.support.v7.widget.RecyclerView
android:id="@+id/list"
android:layout_width="320dp"
android:layout_height="match_parent"/>
和我的清单项目:
<LinearLayout android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/selector_medium_high">
<com.basf.suvinil.crie.ui.common.widget.CircleView
android:id="@+id/circle"
android:layout_width="22dp"
android:layout_height="22dp"/>
<TextView
android:id="@+id/label"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="57.5dp"/>
</LinearLayout>
详细了解这部分android:background="@drawable/selector_medium_high"
这是一个普通的选择器:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/background_high" android:state_activated="true"/>
<item android:drawable="@color/background_high" android:state_pressed="true"/>
<item android:drawable="@color/background_high" android:state_checked="true"/>
<item android:drawable="@color/background_high" android:state_focused="true"/>
<item android:drawable="@color/background_medium"/>
</selector>
但是当我运行此代码时,当我触摸行时,我的背景颜色没有变化....
答案 0 :(得分:52)
在clickable
“列表”的所有元素中将focusable
,focusableInTouchMode
,true
设置为RecyclerView
。
答案 1 :(得分:31)
添加:
android:background="?android:attr/selectableItemBackground"
item.xml
中的
答案 2 :(得分:14)
如果这对您没有任何影响,就像我没有,请使用此代码:
android:foreground="?android:attr/selectableItemBackground"
诀窍在于android:foreground
属性......
答案 3 :(得分:13)
将android:background="?android:attr/selectableItemBackground"
添加到my_list_item.xml
的根布局似乎对我有用(假设您需要默认的选择颜色)。
还要确保根布局的android:layout_width
为match_parent
而不是wrap_content
,以确保整行可以选择。
答案 4 :(得分:6)
不幸的是,使用可聚焦视图来模拟项目选择不是一个好的解决方案,因为:
notifyDataSetChanged
时焦点丢失我写了一个基础适配器类,用RecyclerView自动处理项目选择。只需从中派生适配器并使用state_selected的可绘制状态列表,就像使用列表视图一样。
我有一个Blog Post Here,但这里是代码:
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 = mRecyclerView.getChildPosition(v);
notifyItemChanged(focusedItem);
}
});
}
}
}
答案 5 :(得分:4)
viewHolder.mRlPrince.setOnTouchListener(new View.OnTouchListener() {
@Override public boolean onTouch(View v, MotionEvent event) {
if (event.getAction()==MotionEvent.ACTION_DOWN){
viewHolder.mRlPrince.setBackgroundColor(Color.parseColor("#f8f8f8"));
}if (event.getAction()==MotionEvent.ACTION_UP){
viewHolder.mRlPrince.setBackgroundColor(Color.WHITE);
}
return false;
}
});
答案 6 :(得分:3)
在你的Item&#34; my_list_item.xml&#34;中添加以下属性
android:descendantFocusability="blocksDescendants"
这对我有用!
答案 7 :(得分:1)
您需要在元素xml中设置android:clickable="true"
,如果视图中的某个视图中有更多选择器,则需要设置android:duplicateParentState="true"
那里也是。
这适用于预蜂窝apis。
答案 8 :(得分:0)
许多其他人回答说,唯一的方法是组合选择器和新类来跟踪选择,但最好将此计算委托给适配器。库 FlexibleAdapter 会跟踪您的选择,配置更改也是兼容的。
带有纹波的背景颜色现在可以在没有XML部分的情况下完成,但在代码中可以管理动态数据。
最后,你可以在同一个库中使用很多功能,选择是你可以拥有的一个基本功能。
请查看说明,Wiki页面和完整的工作示例:https://github.com/davideas/FlexibleAdapter
答案 9 :(得分:0)
在您的设计或xml文件上,只需放置以下几行即可。
android:clickable="true"
android:focusable="true"
android:background="?android:attr/activatedBackgroundIndicator"