在Honeycomb设备上进行state_activated

时间:2012-11-23 14:41:56

标签: android listview

您不能将以下状态drawable用作listview项目的背景。

<item android:drawable="@drawable/ic_launcher" android:state_activated="true"/>

在Pre Honeycomb Devices上,因为那里不支持此选择器,并且android版本不会跟踪激活的项目。

如何模仿此行为?特别是当使用fragements(在一个片段的左侧列表,并根据所选择的右侧的详细视图)时,这个指标非常重要。

我知道这个问题是在here之前提出的,但是那里接受的答案链接到一篇博客文章,该文章在“步骤4”中说明没有可能使用激活的指标而只是禁用用于防止错误。这导致没有显示我正在搜索的指标。

4 个答案:

答案 0 :(得分:28)

我使用一个小技巧解决了这个问题:错过了自Android版本1以来存在的state_checked属性,可以模拟state_activated行为。无需修改List适配器或自行保存状态。

我写了一个详细的例子,其中包含了重新制作并在github repository上发布它所需的所有代码。

答案 1 :(得分:3)

就像Chris Jenkins建议的那样,我只需在我的getView覆盖中添加一些代码:

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    // ...

    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
        convertView.setBackgroundColor(Color.WHITE);
        if (listView.isItemChecked(position)) {
            convertView.setBackgroundColor(Color.LTGRAY);
        }
    }
}

在我的情况下自动处理被检查的项目(使用CHOICE_MODE_MULTIPLE和v7 ActionMode.Callback并使用setOnItemLongClickListener调用回调)

答案 2 :(得分:0)

只需将适配器中所选列表项的背景更改为“已激活”的drawable。

所以在我的适配器中,get view方法可能看起来像这样:

getView(int pos, View convertView, ViewGroup parent){
//... etc get view etc
    if(mSelectedItemPos == pos){
        v.setBackgroundDrawable(ctx.getResources().getDrawable(R.drawable.list_item_selected_state);
        //or v.setBackgroundResource(R.drawable.list_item.....);
    } else {
        v.setBackgroundDrawable(ctx.getResources().getDrawable(R.drawable.list_item_selector);            
    }
}

如果我想在视图上支持选定/激活状态,那就是我所做的一切。更多的工作,但可以像你想要的那样灵活。

答案 3 :(得分:0)

我之前以下列方式手动完成:

创建一个数组来保存列表的选定状态,在适配器构造函数中初始化它,然后在getView方法中引用它(如果当前所选项目滚动出视图)和onItemClick方法(更改当前选择并关闭旧的。)

public static boolean selectedStatus[];  // array to hold selected state
public static View oldView;        // view to hold so we can set background back to normal after 

构造函数 初始化数组

public class MyCursorAdapter extends SimpleCursorAdapter {
    private LayoutInflater mInflater;
    private int layout;

    public MyCursorAdapter(Context context, int layout, Cursor c,
        String[] from, int[] to, int flags) {
            super(context, layout, c, from, to, flags);
            mInflater = LayoutInflater.from(context);
            this.layout = layout;
            selectedStatus = new boolean[c.getCount()];
            for (int i = 0; i < c.getCount(); i++) {
            selectedStatus[i] = false;  // Start with all items unselected
        }
    }
} 
当孩子滚出视野时需要

getView

@Override 
public View getView(int position, View convertView, ViewGroup parent) {
    if (convertView == null)
         convertView = View.inflate(context, layout, null);

    if(selectedStatus[position] == true){
        v.setBackgroundResource(R.color.blue);                          
    } else {
        v.setBackgroundResource(R.color.black);
    }
    return v; 
} 

onItemClick 更改数组和屏幕上的所选项目

lv.setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view,
        int position, long id) {           

        mRowId = id;
        EventDisplayFragment eventdisplay = new EventDisplayFragment();
        getFragmentManager().beginTransaction()
                .replace(R.id.rightpane, eventdisplay).commit();
        if(MyCursorAdapter.oldView != null){
            MyCursorAdapter.oldView.setBackgroundResource(R.color.black);   // change the background of the old selected item back to default black                 }
        MyCursorAdapter.oldView = v;                                        // set oldView to current view so we have a reference to change back on next selection
        for (int i = 0; i < selectedStatus.length; i++) {
            if(i == position){                              // set the current view to true and all others to false
                    selectedStatus[i] = true;
                } else {
                    selectedStatus[i] = false;
                }
            }
        }
        v.setBackgroundResource(R.color.blue);
        return true;
    }
});