我已将选择颜色设置为列表视图项
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/rowTextView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:padding="10dp"
android:textColor="@drawable/text_selector"
android:textSize="16sp" >
但是当listview失去焦点时,最后一项的文本颜色将保持选定状态。
- &gt;
我尝试了以下代码,但它无效
View v = mainListView.getSelectedView();
v.setSelected(false);
有没有办法清除项目选择?
编辑。
在使用不同平台进行检查后,该解决方案仍然无法在Android 4.4.4的某些设备上运行(例如:Nexus 10),但它可以在Android 4.3设备上正常运行。
感谢。
答案 0 :(得分:1)
但是当listview失去焦点时,最后一项的文本颜色将保持选定状态。
请从您的选择器drawable xml中删除state_selected并为其声明一些choiceMode。 我的ListView声明:
<ListView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:choiceMode="singleChoice"
android:listSelector="@drawable/main_list_selector"
...
我的列表视图选择器(main_list_selector.xml):
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true" android:drawable="@drawable/button_focused"/>
<item android:state_pressed="true" android:drawable="@drawable/button_checked_background"/>
<item android:state_activated="true" android:drawable="@drawable/button_checked_background"/>
</selector>
行项目布局:
<?xml version="1.0" encoding="utf-8"?>
<com.example.yourapp.ui.checkable.CheckableLinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<CheckedTextView
android:id="@+id/item_text_view"
...
android:background="@drawable/row_item background"/>
</com.example.yourapp.ui.checkable.CheckableLinearLayout>
row_item背景:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_checked="true" android:drawable="@drawable/button_checked_background"/>
<item android:drawable="@android:color/transparent"/>
</selector>
如你所见,我正在使用CheckedTextView,背景为“row_item background”,它具有drawable state_checked和custon LinearLayout。 LinearLayout代码:
public class CheckableLinearLayout extends LinearLayout implements Checkable {
private boolean checked = false;
public CheckableLinearLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CheckableLinearLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public boolean isChecked() {
return this.checked;
}
@Override
public void setChecked(boolean checked) {
this.checked = checked;
this.setSelected(this.checked);
final int childsCount = getChildCount();
for (int i = 0; i < childsCount; ++i) {
View child = getChildAt(i);
if (child instanceof Checkable) {
((Checkable) child).setChecked(checked);
}
}
}
@Override
public void toggle() {
setChecked(!this.checked);
}
}
我在这个https://stackoverflow.com/a/7425650/2133585答案中发现了一些隐藏的机器人逻辑。
答案 1 :(得分:0)
试试这个:
v.clearChoices();
v.requestLayout();
编辑:
根据此链接ListView selection remains persistent after exiting choice mode,您还可以尝试:
v.clearChoices();
for (int i = 0; i < v.getCount(); i++)
v.setItemChecked(i, false);
v.post(new Runnable() {
@Override
public void run() {
v.setChoiceMode(ListView.CHOICE_MODE_NONE);
}
});
答案 2 :(得分:0)
由于上述解决方案仍无法在某些设备上运行,因此我找到了解决此问题的解决方案。
private View mSelectedView; // the view has been selected
// set text color when the list view get focus or not
mainListView.setOnFocusChangeListener(new OnFocusChangeListener() {
if(hasFocus) {
if(mSelectedView != null && mSelectedView instanceof TextView)
((TextView)mSelectedView).setTextColor(getResources().getColorStateList(R.drawable.text_selector));
} else {
mSelectedView = mainListView.getSelectedView();
if(mSelectedView != null && mSelectedView instanceof TextView)
((TextView)mSelectedView).setTextColor(getResources().getColor(R.color.default_color));
}
});