禁用与选择器和IsEnabled的列表视图项() [英] Disable listview items with selector and isEnabled()

查看:169
本文介绍了禁用与选择器和IsEnabled的列表视图项()的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

范围: - 使用被覆盖的ArrayAdapter; - 使用选择; - 使用IsEnabled的禁用物品

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

问题: - 一切正常(自定义视图,选择了重点不突出,focuesd和pressed状态),但已禁用的项目不使用选择器禁用状态

调查:(!)。当我使用的IsEnabled禁用列表视图中的层次浏览器的一些项目表明已禁用的项目unfocusable,不可点击,但启用

它是一个错误或缺了点什么?

P.S。实际上,文档说的IsEnabled没有为列表项目做的setEnabled(假),它使一个分频器(?)对象。 PPS我还试图用if语句来设置我的观点(在getView)为IsEnabled的(假)。但它仅适用于重点项目?

我的选择是这样的:

 < XML版本=1.0编码=UTF-8&GT?;
<选择的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android>
    <! - 禁用 - >
    <项目
        机器人:state_enabled =假
        机器人:文字颜色=@色/ greyDark
        机器人:可绘制=@可绘制/ list_item_disabled/>
    <  - !pressed  - >
    <项目
        机器人:state_enabled =真
        机器人:STATE_ pressed =真
        机器人:文字颜色=@机器人:彩色/白
        机器人:可绘制=@可绘制/ list_item_ pressed/>
    <! - 聚焦 - >
    <项目
        机器人:state_enabled =真
        机器人:state_focused =真
        机器人:文字颜色=@机器人:彩色/白
        机器人:可绘制=@可绘制/ list_item_focused/>
    <! - 默认 - >
    <项目
        机器人:state_enabled =真
        机器人:可绘制=@可绘制/ list_item_unfocused/>
< /选择器>
 

解决方案

哈克: 使用getView检查禁用的项目的逻辑和观点膨胀与另一布局。 IsEnabled的仍然是有用的。

  @覆盖
公共查看getView(INT位置,查看convertView,ViewGroup中父){
    LayoutInflater充气=(LayoutInflater)mContext
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    查看排;

    如果(mListItem [位置] .isEnabled()==假)行= inflater.inflate(
            R.layout.list_row_disabled,NULL);
    其他 {
        行= inflater.inflate(R.layout.list_row,NULL);
        //设置正确的扩展图标
        如果(mListItem [位置] .getType()){
            ImageView的ic_arrow =(ImageView的)row.findViewById(R.id.list_row_arrow);
            ic_arrow.setImageResource(R.drawable.ic_arrow_right);
        }
    }
    //设置左图标
    ImageView的ic_item =(ImageView的)row.findViewById(R.id.list_row_icon);
    ic_item.setImageResource(mListItem [位置] .getIcon());
    //混合图标,如果项目被禁用
    如果(mListItem [位置] .isEnabled()==假)
        ic_item.setColorFilter(0x99D0D0D0,Mode.SRC_ATOP); //使图标看起来灰暗

    //设置标题文字
    TextView的txvTitle =(TextView中)row.findViewById(R.id.list_row_title);
    txvTitle.setText(mListItem [位置] .getTitle());

    返回行;
}

@覆盖
公共布尔的IsEnabled(INT位置){
    返回mListItem [位置] .isEnabled();
}
 

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>

解决方案

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();
}

这篇关于禁用与选择器和IsEnabled的列表视图项()的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆