Установка фона программно переопределяет возможность рисования

У меня есть ListView, и у меня есть Drawable для каждого элемента в ListView, чтобы выделить каждую строку, когда она выбрана/нажата. У меня также есть собственный адаптер, в котором я программно устанавливаю цвет фона каждой строки (я хочу, чтобы цвета фона менялись). Это новая функция, которую я добавил, и перед добавлением кода строки будут подсвечиваться синим цветом, но после этого они не выделяются. Не уверен, как это исправить. Вот что у меня есть:

Макет элемента ListView

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical"
    android:paddingLeft="5dip"
    android:paddingRight="5dip"
    android:paddingTop="8dip"
    android:paddingBottom="8dip"
    android:background="@drawable/app_selector"
>    
    <TextView  
        android:id="@+id/text"
        style="@style/ListingTitle"
        android:layout_alignParentTop="true"
        android:paddingBottom="2dip"
    />

</RelativeLayout>

Рисуемый

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

<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_pressed="true" android:drawable="@color/light_blue" />

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

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

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

</selector>

Фрагмент

public class ListingFragment extends SherlockListFragment
{
    public void onActivityCreated(final Bundle icicle)
    {    
        ListView lv = getListView();

        mListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
        mListView.setMultiChoiceModeListener(new MultiChoiceModeListener() {

                @Override
                public void onItemCheckedStateChanged(android.view.ActionMode mode, int position, long id, boolean checked) {
                }

                @Override
                public boolean onActionItemClicked(android.view.ActionMode mode, android.view.MenuItem item) {
                }
        }
    }

     /* ADAPTER */
     private class CustomAdapter extends BaseAdapter 
     {       
        @Override
        public View getView(final int position, View convertView, final ViewGroup parent)
        {
            final ViewHolder holder;
            if (convertView == null)
            {
                holder = new ViewHolder();

                convertView = mInflater.inflate(R.layout.item, parent, false);
            }
            else 
            {
                holder = (ViewHolder)convertView.getTag();
            }

            if (position % 2 == 0)
                convertView.setBackgroundColor(Color.GRAY);
            else
                convertView.setBackgroundColor(Color.TRANSPARENT);

            return(convertView);
        }
    }

}

person Kris B    schedule 05.08.2013    source источник
comment
привет, я попробовал твой код на своей локальной машине, он отлично работает.   -  person Weibo    schedule 05.08.2013


Ответы (2)


Расширяя ответ дума, вам не нужно делать всю эту работу в коде.

Вытяжной А

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

Вытяжной B

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

В вашем адаптере:

if (position % 2 == 0) {
    convertView.setBackgroundResource(R.drawable.A);
} else {
    convertView.setBackgroundResource(R.drawable.B);
}
person sddamico    schedule 05.08.2013

вместо того, чтобы изменять рисунок с помощью простого цвета, сначала создайте новый объект рисования программно и установите состояния так же, как в вашем xml, а затем установите цвета для каждого состояния. затем попробуйте заменить свой фон на программно созданный drwable.

person dum    schedule 05.08.2013