Android 使用选择器和isEnabled()禁用listview项
范围: -使用重写的ArrayAdapter; -使用选择器; -使用isEnabled禁用项目 目标: -禁用某些列表项并通过选择器加载禁用状态视图 问题: -一切正常(自定义视图、未聚焦、聚焦和按下状态的选择器),但禁用项不使用禁用状态的选择器 调查:当我在listview层次结构查看器中使用isEnabled禁用某些项目时,显示禁用的项目不可聚焦、不可链接,但已启用(!) 它是一个错误还是缺少什么 另外,实际上,文档说isEnabled并没有对列表项执行setEnabled(false),它使它成为一个分隔符(?)对象。 P.P.S我还尝试使用if语句将我的视图(在getView中)设置为isEnabled(false)。但它只适用于重点项目 我的选择器看起来像:Android 使用选择器和isEnabled()禁用listview项,android,xml,listview,android-arrayadapter,Android,Xml,Listview,Android Arrayadapter,范围: -使用重写的ArrayAdapter; -使用选择器; -使用isEnabled禁用项目 目标: -禁用某些列表项并通过选择器加载禁用状态视图 问题: -一切正常(自定义视图、未聚焦、聚焦和按下状态的选择器),但禁用项不使用禁用状态的选择器 调查:当我在listview层次结构查看器中使用isEnabled禁用某些项目时,显示禁用的项目不可聚焦、不可链接,但已启用(!) 它是一个错误还是缺少什么 另外,实际上,文档说isEnabled并没有对列表项执行setEnabled(false),
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Disabled -->
<item
android:state_enabled="false"
android:textColor="@color/greyDark"
android:drawable="@drawable/list_item_disabled" />
<!-- Pressed -->
<item
android:state_enabled="true"
android:state_pressed="true"
android:textColor="@android:color/white"
android:drawable="@drawable/list_item_pressed" />
<!-- Focused -->
<item
android:state_enabled="true"
android:state_focused="true"
android:textColor="@android:color/white"
android:drawable="@drawable/list_item_focused" />
<!-- Default -->
<item
android:state_enabled="true"
android:drawable="@drawable/list_item_unfocused" />
</selector>
黑客:
使用getView检查禁用的项目逻辑,并使用其他布局为视图充气。isEnabled仍然有用
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) mContext
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View row;
if (mListItem[position].isEnabled() == false) row = inflater.inflate(
R.layout.list_row_disabled, null);
else {
row = inflater.inflate(R.layout.list_row, null);
// set right extensible icon
if (mListItem[position].getType()) {
ImageView ic_arrow = (ImageView) row.findViewById(R.id.list_row_arrow);
ic_arrow.setImageResource(R.drawable.ic_arrow_right);
}
}
// set left icon
ImageView ic_item = (ImageView) row.findViewById(R.id.list_row_icon);
ic_item.setImageResource(mListItem[position].getIcon());
// blend icon if item is disabled
if (mListItem[position].isEnabled() == false)
ic_item.setColorFilter(0x99D0D0D0,Mode.SRC_ATOP); // make icons look grayer
// set title text
TextView txvTitle = (TextView) row.findViewById(R.id.list_row_title);
txvTitle.setText(mListItem[position].getTitle());
return row;
}
@Override
public boolean isEnabled(int position) {
return mListItem[position].isEnabled();
}
适配器中的函数isEnabled()只会使项不可聚焦和不可访问。
您需要在adapter.getView()
的末尾调用view.setEnabled()
,以使选择器正常工作
另外,对于要将启用状态传递给其子视图的父视图,您需要为xml文件中的子视图指定属性android:duplicateParentState=“true”
。未来读者注意:不要像我那样做,假设我只需要第一部分,因为我的xml布局文件中没有嵌套的布局!