Нужна помощь с селектором цвета для проверенных элементов ListView - PullRequest
9 голосов
/ 11 февраля 2011

У меня есть ListView с пользовательским макетом для его элементов, и мне нужно указать отдельный цвет фона для отмеченных элементов с помощью селектора.Вот селектор для нечетных элементов:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:drawable="@android:color/black" />
    <item android:state_checked="true" android:drawable="@android:color/black" />
    <item android:state_selected="true" android:drawable="@color/red" />
    <item android:drawable="@android:color/white" />
</selector>

, а вот селектор для четных элементов:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:drawable="@android:color/black" />
    <item android:state_checked="true" android:drawable="@android:color/black" />
    <item android:state_selected="true" android:drawable="@color/red" />
    <item android:drawable="@color/gray" />
</selector>

Шаблон элемента ListView выглядит следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<com.androidhub.core.CheckableLinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="40dip">
    <TextView 
        android:text="TextView" 
        android:id="@+id/textView1" 
        android:layout_height="fill_parent" 
        android:layout_width="wrap_content" 
        android:gravity="center_vertical" 
        android:textColor="@color/list_item"></TextView>
</com.androidhub.core.CheckableLinearLayout>

корневым элементом элемента списка является CheckableLinearLayout: http://paste.org/pastebin/view/28711

В ListView есть режим с одним выбором (я также пробовал режим с множественным выбором, но он также не работает для меня)

public class MainActivity extends ListActivity {

    List<String> items = new ArrayList<String>();

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        items.add("test 1");
        items.add("test 2");
        items.add("test 3");
        items.add("test 4");
        getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
        getListView().setAdapter(new TestAdapter(this, items));
        getListView().setBackgroundColor(getResources().
            getColor(android.R.color.white));
    }
}

В адаптере дляэтот ListView я вызываю setChecked () метод CheckableLinearLayout, но он не меняет свой цвет:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    LayoutInflater inflater = LayoutInflater.from(getContext());
    View v = convertView;
    if(v == null) {
        v = inflater.inflate(R.layout.list_item, null);
    }

    if(position % 2 != 0) {
        v.setBackgroundResource(R.drawable.list_item_even);
    }
    else {
        v.setBackgroundResource(R.drawable.list_item_odd);
    }

    if(parent instanceof ListView) {
        ListView lv = (ListView)parent;
        if(v instanceof CheckableLinearLayout) {
            CheckableLinearLayout cll = (CheckableLinearLayout)v;
            cll.setChecked(lv.isItemChecked(position));
        }
    }

    return v;
}

Что я делаю не так?Я вижу, что элемент state_pressed из селектора работает нормально, а state_checked - нет.Каков будет правильный подход к настройке state_checked фона из XML, а не из кода?

Ответы [ 3 ]

2 голосов
/ 05 октября 2011

Я думаю, что вы ищете этот атрибут:

android:duplicateParentState="true"

Попробуйте добавить его в свой тег CheckableLinearLayout в макете ячейки.

Нажатие / отпускание клавиши - единственное событие, которое распространяется на дочерние представления ViewGroup, поэтому каждое представление будет управлять своим собственным состоянием, если вы явно не скажете ему использовать его родителей.

Кроме того, после этого изменения, я думаю, вы можете просто удалить весь блок кода, который вызывает проверку CheckableLinearLayout:

if(parent instanceof ListView)...
0 голосов
/ 11 августа 2011

Вы пытались создать XML для хранения вашего ListView, подобного этому? Вокруг тега @ + id / android: list есть немного волшебства.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical" 
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" 
        android:background="@drawable/megaphone_320x480">
        <ListView 
                android:id="@+id/android:list"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent" 
                android:background="@drawable/megaphone_320x480"
                android:cacheColorHint="@drawable/transparent"
                />
        <TextView 
                android:id="@id/android:empty" 
                android:layout_width="fill_parent"
                android:layout_height="fill_parent" 
                android:textColor="@drawable/red"
                android:gravity="center_vertical|center_horizontal"
                android:textStyle="bold"
                android:text="@string/error_no_groups" 
                />
</LinearLayout>
0 голосов
/ 11 августа 2011

Попробуйте реализовать getListView (). SetOnItemClickListener следующим образом:

OnItemClickListener listener = new OnItemClickListener() {

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

        CheckableLinearLayout r;
        for(int i = 0; i< lv.getChildCount(); i++) {
            r= (CheckableLinearLayout)lv.getChildAt(i);
            if(i==position)
                r.setChecked(true);
            else
                r.setChecked(false);
        }

    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...