Изменить выделение в ListView с оранжевого на зеленый - PullRequest
22 голосов
/ 31 января 2010

Как мне сделать это для выбранного элемента списка.

Я пытался добавить это к android:background

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_focused="true" 
        android:state_pressed="false"
        android:drawable="@color/android_green" />
    <item android:state_focused="true" 
        android:state_pressed="true"
        android:drawable="@color/black_alpha" />
    <item android:state_focused="false" 
        android:state_pressed="true"
        android:drawable="@color/black_alpha" />
    <item android:drawable="@color/white_alpha" />
</selector> 

но это не работает, оно меняет весь ListView.


Все еще не работает, вот что у меня есть

:: listview_background

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_focused="true" android:drawable="@color/black_alpha" />
    <item android:drawable="@color/white_alpha" />  
</selector> 

:: Мой взгляд, который использует выше

<ListView android:id="@+id/list" android:layout_width="fill_parent"
    android:layout_height="fill_parent" android:layout_below="@+id/round"
    android:listSelector="@drawable/listview_background">
</ListView>

Проблема в том, что black_alpha будет применять весь список, а не только выбранный элемент списка

Ответы [ 5 ]

21 голосов
/ 31 января 2010

Вот хорошая статья о том, как использовать селекторы со списками.

Вместо того, чтобы установить его как android:background в ListView, я думаю, что вы хотите установить android:listSelector, как показано ниже:

<ListView android:id="@+id/list" 
      android:layout_width="fill_parent"
      android:layout_height="wrap_content" 
      android:layout_gravity="center"
      android:divider="@null" 
      android:dividerHeight="0dip"
      android:listSelector="@drawable/list_selector" />
8 голосов
/ 20 октября 2010

Джекс, ты сказал, что:

Проблема в том, что black_alpha будет применять весь список, а не только выбранный элемент списка

У меня была такая же проблема. Поработав с ним некоторое время, я смог заставить его перестать применять цвет ко всему списку, используя 3x3 png изображение нужного мне цвета вместо применения цвета. Поэтому по какой-то странной причине, если вы используете цвет, вы получаете странное фоновое поведение, когда вы используете png, он работает нормально. : S

Так что это один из способов обойти это.

----- Другой способ ----------

Я нашел лучшие результаты, когда установил селектор listView, чтобы не было никаких состояний, подобных этому:

Рез / рисуем / list_selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
</selector>

Тогда я забочусь о всех состояниях на заднем плане элемента списка. НЕ в селекторе. Я обнаружил, что таким образом у меня больше контроля.

Рез / цвет / list_item_bg.xml

<?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="@color/list_item_black_translucent" />
<item android:state_pressed="true" 
    android:drawable="@color/light_green_accent_translucent" />
</selector>

Тогда вот мой элемент списка:

Рез / макет / simple_list_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingRight="45dip"
android:paddingBottom="2dip"
android:layout_gravity="center_vertical"
android:background="@color/list_item_bg">
  <ImageView
    android:id="@+id/arrow"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginRight="8dip"
    android:src="@drawable/list_item_arrow" />
 <TextView
android:id="@+id/simple_list_item_label"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:textSize="12sp"
android:textColor="@color/list_label_color"/>
</LinearLayout>
3 голосов
/ 25 марта 2011

Я также столкнулся с вашей проблемой, когда изменение цвета относится ко всему списку.

Но теперь это работает для меня сейчас:

Моя главная страница, содержащая просмотр списка (заметил, что здесь не применен селектор списка):

 <ListView 
    android:id="@+id/controlList" android:layout_width="wrap_content" android:layout_height="wrap_content"/>

Вместо этого применил listselector к getView, это как сказать этой конкретной строке (convertView) , чтобы использовать listselector.xml в методе drawable, который можно складывать при изменении его состояния, например, нажата, сфокусирована ...:

@Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder viewHolder;
            if(convertView == null){
                LayoutInflater li = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
                convertView = li.inflate(R.layout.control_list, null);
                viewHolder = new ViewHolder();

                viewHolder.topText = (TextView) convertView.findViewById(R.id.toptext);
                viewHolder.bottomText = (TextView) convertView.findViewById(R.id.bottomtext);
                convertView.setTag(viewHolder);

            }
            else{
                viewHolder = (ViewHolder) convertView.getTag();
            }


                    //each convertView will be assigned the listselector
            convertView.setBackgroundResource(R.drawable.listselector);


            viewHolder.topText.setText(testSchemes[position]);

            //viewHolder.vText.setText(testDetails[position]);
            return convertView;
        }

И, наконец, мой listselector.xml:

<?xml version="1.0" encoding="utf-8"?>

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="false"
        android:state_selected="false"
        android:drawable="@color/lightgreen" />

    <!-- Even though these two point to the same resource, have two states so the drawable will invalidate itself when coming out of pressed state. -->
    <item android:state_pressed="true" 

        android:drawable="@color/darkgreen" />

    <item android:state_selected="true" android:state_pressed="false"
        android:drawable="@color/orange" />



</selector>

Вот что делает приведенный выше код: Все записи при первой загрузке являются светло-зелеными. Прокрутка вверх и вниз с помощью курсора выделяет выделенную запись оранжевым цветом. Нажатие ряда превращает его в темно-зеленый.

2 голосов
/ 15 ноября 2012

Как упомянуто в комментарии, в работающем решении вместо цвета используется форма (я также выделил весь список). Вот полное решение:

добавить эти 2 атрибута в список просмотра:

android:drawSelectorOnTop="true"
android:listSelector="@drawable/my_list_selector"

добавить my_list_selector.xml в папку для рисования:

<?xml version="1.0" encoding="UTF-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> 
    <solid android:color="#77526F35"/>
</shape>

Теперь элементы списка должны отображать полупрозрачный зеленый цвет в нажатом состоянии.

0 голосов
/ 04 августа 2013

Я столкнулся с той же проблемой, и тогда мне просто нужна была простая строка в моем представлении элементов xml.

    android:background="?android:attr/activatedBackgroundIndicator"

Проверьте это сообщение: Это сообщение может помочь

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