使用选择器和 isEnabled() 禁用列表视图项目

发布于 2024-11-25 03:36:43 字数 1447 浏览 1 评论 0原文

范围: - 使用重写的ArrayAdapter; - 使用选择器; - 使用 isEnabled 禁用项目。

目标: - 禁用某些列表项并通过选择器加载禁用状态视图。

问题: - 一切正常(自定义视图、未聚焦、聚焦和按下状态的选择器),但禁用的项目不使用禁用状态的选择器。

调查:当我使用 isEnabled 禁用列表视图层次结构查看器中的某些项目时,显示禁用的项目不可聚焦、不可点击,但(!)已启用。

这是一个错误还是缺少什​​么?

PS 实际上,文档说 isEnabled 不会对列表项执行 setEnabled(false) 操作,它使其成为分隔符(?)对象。 PPS 我还尝试使用 if 语句将我的视图(在 getView 中)设置为 isEnabled(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>

Scope:
- using overriden ArrayAdapter;
- using selector;
- using isEnabled for disabling items.

Aim:
- disable some list items and load disabled state view via selector.

Problem:
- everything works (custom view, selector for unfocused, focuesd and pressed states) but disabled items don't use selector for disabled state.

Investigating: when I use isEnabled for disabling some items in listview Hierarchy Viewer shows that disabled items are unfocusable, unclickable but(!) enabled.

Is it a bug or something is missing?

P.S. actually, docs say that isEnabled doesn't do setEnabled(false) for list item, it makes it a divider(?) object.
P.P.S I also tried to use if-statement to set my View (in getView) as isEnabled(false). But it works only for focused items?

My Selector looks like:

<?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>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

聆听风音 2024-12-02 03:36:43

适配器中的函数 isEnabled() 只会使项目不可聚焦和不可点击。
您需要在 adapter.getView() 末尾调用 view.setEnabled() 以使选择器正常工作。

此外,为了让父视图将启用状态传递给其后代,您需要在 xml 文件中为子视图指定属性 android:duplicateParentState="true"

The function isEnabled() in the adapter only makes item unfocusable and unclickable.
You need to call view.setEnabled() at the end of adapter.getView() to make your selector functional.

Also, for a parent view to pass enable state to its descendants, you need to specify the attribute android:duplicateParentState="true" to the child views in your xml file.

无言温柔 2024-12-02 03:36:43

黑客:
使用 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();
}

Hack:
use getView to check disabled item logic and inflate view with another layout. isEnabled is still usefull.

@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();
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文