ListView选择自定义颜色

时间:2012-09-01 17:10:39

标签: android android-layout android-listview android-ui android-listfragment

我已经制作了自己的自定义主题,但有一些主题没有颜色的位,例如我正在处理的ListView,所以我正在逐个进行。我已完成了这项功课,并了解了如何创建可绘制的背景选择器XML文件,但它无法正常工作。此外,我尝试了一些其他方法来强迫它,但无法让它工作。我会告诉你问题,然后按照我的代码进行操作。

“按下”颜色正常。在这个截图中,我按下并按住一个项目:

Pressing ListView Item

然而,当我移开手指时,所选项目不会保持颜色。请注意,选中并显示清单1但没有突出显示:

Finger removed, ListView Item is selected but no color

这是我应用于每个列表项视图的背景绘制:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="false" android:state_pressed="false"
    android:drawable="@android:color/transparent" />
<item android:state_pressed="true" android:drawable="@android:color/holo_orange_dark" />
<item android:state_selected="true" android:state_pressed="false"
    android:drawable="@android:color/holo_orange_light" />
</selector>

您会注意到“已选择”应显示“holo_orange_light”,但不会。以下代码是我分配背景的地方。我最初是在实例化一个现成的ArrayAdapter。为了应用这个背景,我从ArrayAdapter开始,并将代码添加到构建视图的方法中。

这是自定义的ArrayAdapter:

private class CustomArrayAdapter extends ArrayAdapter<Checklist> {

    public CustomArrayAdapter(Context context, int resource, int textViewResourceId,
            List<Checklist> objects) {
        super(context, resource, textViewResourceId, objects);

    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        convertView = super.getView(position, convertView, parent);
        convertView.setBackgroundResource(R.drawable.listview_background);
        return convertView;
    }

}

FWIW这是创建适配器的调用,因此您可以看到我使用的参数:

setListAdapter(new CustomArrayAdapter(getActivity(),
                android.R.layout.simple_list_item_activated_1, android.R.id.text1,
                KnowUrStuffApp.getDbHelper().getChecklists()));

所以代码离开了我现在的位置。然而,我试图以一些多余的方式强制它着色。我创建了一个名为setSelectionHilight的例程,它将视图背景明确地着色为全息橙色。然后我创建了一个分配给ListView的onItemSelectedListener,它调用了setSelectionHilight。然后,一旦所有东西加载,我就会明确地调用例程。这些都没有任何影响:

private void setSelectionHilight(ListView listView, View selectedView) {
    for (int i = 0; i < listView.getChildCount(); i++) {
        View child = listView.getChildAt(i);
        if (child == selectedView)
            child.setBackgroundColor(getActivity().getResources().getColor(android.R.color.holo_orange_light));
        //else
            //child.setBackgroundResource(0);
    }
}


private OnItemSelectedListener onItemSelectedListener = new OnItemSelectedListener() {



    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
        setSelectionHilight((ListView) parent, view);

    }

    @Override
    public void onNothingSelected(AdapterView<?> parent) {
        setSelectionHilight((ListView) parent, null);

    }

};

同样,我只是在上面直接尝试了这个块。在考虑我的问题的解决方案时,您可以放心地忽略它,但我将其包含在一个完整的图片中。感谢您解决此问题的任何帮助。另一点辅助信息是ListView被封装在ListFragment中,我使用的是默认布局。我没有ListView的显式XML元素。

1 个答案:

答案 0 :(得分:1)

我想做类似的事情并开发自己的逻辑来实现它。我的代码用于突出显示当前选择的ChildView,如果您看到代码,则可以为ParentView和ChildView实现它。

    public int _groupPosition = -1;
    View _lastColored;
    private int _highlightedGroup = -1;
    private int _highlightedChild;



    public boolean onChildClick(ExpandableListView parent, View v,
            int groupPosition, int childPosition, long id) {

        _groupPosition = groupPosition;
        _highlightedGroup = groupPosition;
        _highlightedChild = childPosition;
        if (_lastColored != null) {
            _lastColored.setBackgroundColor(Color.TRANSPARENT);
        }
        _lastColored = v;
        v.setBackgroundColor(Color.rgb(214, 214, 214)); // whatever colour you want to set
             ..... // your code here
}

无需在XML文件中使用任何选择器。这段代码完成了所有工作。祝你好运!