Android: элементы в списках не становятся оранжевыми при нажатии?

У меня есть ListView в коде моего приложения, которое при нажатии использует AdapterView.OnItemClickListener для обнаружения кликов. Проблема в том, что когда я нажимаю на элемент, фон этого элемента становится белым, а не оранжевым по умолчанию. Вот так:введите здесь описание изображения

Кроме того, когда я не использую AdapterView, выбранные элементы без проблем становятся оранжевыми. Как сделать фон выбранного элемента снова оранжевым?

РЕДАКТИРОВАТЬ:

макет списка: main.xml

    <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity" 
    android:background="#00000000">


        <!-- ListView (grid_items) -->

        <ListView android:id="@+id/listview"
            android:layout_height="fill_parent"
            android:textSize="15px"
            android:layout_width="fill_parent"
            android:background="#00000000">
        </ListView>

</RelativeLayout>

при создании():

public void onCreate(Bundle savedInstanceState) {try{
    super.onCreate(savedInstanceState);


    setContentView(R.layout.main);
    lv= (ListView)findViewById(R.id.listview);
    lv.setBackgroundColor(Color.TRANSPARENT);
    lv.setCacheColorHint(Color.TRANSPARENT);
    //......calculations
    for(int q = 0; q <v; q++){
        HashMap<String, String> map = new HashMap<String, String>();
        map.put("col_1", array[q]);
        fillMaps.add(map);
        lv.setOnItemClickListener(onListClick);
    }
    //......calculations
    }

АдаптерВью:

private AdapterView.OnItemClickListener onListClick=new AdapterView.OnItemClickListener(){

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

lv.setBackgroundColor(Color.TRANSPARENT);
lv.setCacheColorHint(Color.TRANSPARENT);
//.....calculations
}

Используемая пользовательская тема:

    <?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="CustomWindowTitleBackground">
        <item name="android:background">#323331</item>
    </style>

    <style name="CustomTheme" parent="android:Theme">
        <item name="android:windowTitleSize">35dip</item>
        <item name="android:windowTitleBackgroundStyle">@style/CustomWindowTitleBackground</item>
    </style>
</resources>

person vergil corleone    schedule 02.06.2013    source источник
comment
Привет, как насчет публикации кода, который вы используете?   -  person slevon    schedule 02.06.2013
comment
какая текущая тема используется?   -  person karan    schedule 02.06.2013
comment
@KaranMer Это пользовательская тема, я добавил код в вопрос.   -  person vergil corleone    schedule 02.06.2013
comment
this android:windowTitleBackgroundStyle Ресурс стиля, используемый для области заголовка окна. я думаю не то что ты хочешь   -  person karan    schedule 02.06.2013
comment
@karan Mer Я использую настраиваемую строку заголовка, это сделано специально.   -  person vergil corleone    schedule 02.06.2013
comment
я должен работать <item android:state_pressed="true" android:drawable="@color/YOUR_COLOR_HERE" /> <!-- default -->   -  person karan    schedule 02.06.2013
comment
давайте продолжим обсуждение в чате   -  person karan    schedule 02.06.2013
comment
Кто-нибудь знает, что делать?   -  person vergil corleone    schedule 03.06.2013


Ответы (4)


Лучший способ настроить элементы представления списка — создать их в файле xml, а затем с помощью BaseAdapter или любого другого адаптера списка раздуть этот макет .xml и заполнить вашими данными. Чтобы настроить анимацию выделения, все, что вам нужно, это создать состояние Drawable для различных состояний элемента.

Итак, вы переходите к «Новый файл xml» -> «Тип ресурса» -> «Форма», назовите его и закончите, вы увидите этот фрагмент кода:

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


</shape>

Давайте создадим фон для нажатого состояния ListItem:

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

    <solid android:color="#86d47f" this is your custom color />  

</shape>

а ненажатое состояние - это другой файл:

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

    <solid android:color="#00000000" />

</shape>

затем файл селектора списка, который будет использоваться в качестве фона элемента списка: перейдите к «новому файлу xml» -> «drawable» -> «селектор списка», назовите его как «item_background» -> Finish

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"  android:exitFadeDuration="300"  !!this is the fade duration time for your animation>

    <item android:drawable="@drawable/bg_drawable" android:state_pressed="true"></item>
    <item android:drawable="@drawable/transparend"></item>

</selector>

затем создайте xml файл для элемента, настройте его как хотите, но для основного макета установите

android:background="@drawable/item_background"

вот, все работает отлично... вот мой класс адаптера:

public class ListAdapter extends ArrayAdapter<String> {
LayoutInflater inflater;

public ListAdapter(Context context, int textViewResourceId,
        List<String> objects) {
    super(context, textViewResourceId, objects);
    inflater = LayoutInflater.from(context);

}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    String str_value = this.getItem(position);
    if (convertView == null) {
        convertView = inflater.inflate(R.layout.list_item, null);
    }
    TextView tv = (TextView) convertView.findViewById(R.id.textView1);
    tv.setText(str_value);
    return convertView;
}

}

и вот, предположим, вы отметите это как ответ. list

person Alex    schedule 06.06.2013
comment
В строке <solid android:color="#86d47f" this is your custom color /> какой шестнадцатеричный код для оранжевого цвета Android по умолчанию? - person vergil corleone; 06.06.2013
comment
‹solid android:color=@android:color/holo_orange_dark /› - person Alex; 06.06.2013
comment
или ‹solid android:color=@android:color/holo_orange_light /› - person Alex; 06.06.2013
comment
я ответил на ваш вопрос? - person Alex; 06.06.2013
comment
В строке android:exitFadeDuration="300" какова продолжительность затухания анимации щелчка Android по умолчанию? - person vergil corleone; 07.06.2013
comment
Не могли бы вы уточнить then create an xml file for an item,. Я добавил android:background="@drawable/item_background" в ListView, но проблема осталась. - person vergil corleone; 07.06.2013
comment
вам нужно создать макет для вашего элемента listView. Вам нужно создать файл .xml с макетом и всеми необходимыми виджетами. В адаптере вы раздуете этот макет и будете использовать его как элементы listView. Я дал вам ссылку на статью, где описан механизм действия - person Alex; 07.06.2013
comment
Я так сделал и ничего не изменилось. - person vergil corleone; 07.06.2013

поэтому одно простое решение - установить цвет представления в самом onClicklistenener:

private AdapterView.OnItemClickListener onListClick=new 
AdapterView.OnItemClickListener(){

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

   lv.setBackgroundColor(Color.TRANSPARENT);
   lv.setCacheColorHint(Color.TRANSPARENT);
   // I added this
   if(is the item checked ){
      view.setBackgroundColor(Color.BLUE); //or whatever
   }else{
      view.setBackgroundColor(00000000);
   }
   //.....calculations
}

Вам нужно будет хранить информацию о том, проверен элемент или нет.

Если вы не хотите использовать onClickListener, а используете только стили (что может быть предпочтительнее), я пока не могу вам помочь.

Изменить: кстати, я не понимаю, почему вы делаете это в onClickListener каждый раз:

lv.setBackgroundColor(Color.TRANSPARENT);
lv.setCacheColorHint(Color.TRANSPARENT);

Надеюсь, это поможет в любом случае.

person slevon    schedule 03.06.2013
comment
Спасибо за ответ. Как проверить, проверен элемент или нет? А что такое просмотр в view.setBackgroundColor()? - person vergil corleone; 03.06.2013
comment
view – это элемент ListItem, который был фактически нажат. О том, как проверить, выбран ли элемент, попробуйте прочитать: stackoverflow.com/questions/8463373/ - person slevon; 04.06.2013
comment
Существует проблема. Оранжевое выделение по умолчанию на самом деле является анимацией, а не цветом. И я хотел бы отметить одну вещь: посмотрите на скриншот в вопросе. Alabama выбран, и его фон белый, но посмотрите на верхний край Alabama, там видно немного оранжевого цвета. Это наверное анимация щелчка! Это дает вам представление о том, что может быть не так? - person vergil corleone; 04.06.2013

Попробуйте это, чтобы установить любой пользовательский селектор:

В 'styles.xml' создайте этот стиль:

<style name="MyList">
        <item name="android:drawSelectorOnTop">true</item>
        <item name="android:listSelector">@drawable/my_list_selector</item>
</style>

И в вашем макете просто добавьте этот стиль в ListView:

<ListView
....
style="@style/MyList"
.... />

А в «drawable» вы можете определить «my_list_selector» с желаемым цветом или изображением:

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

    <item android:state_pressed="true">
        <shape>
            <solid android:color="@color/state_pressed" />
        </shape>
    </item>
    <item android:state_focused="true">
        <shape>
            <solid android:color="@color/state_focused" />
        </shape>
    </item>
    <item android:drawable="@android:color/transparent" />

</selector> 

Добавьте эти значения цвета в ваш 'colors.xml':

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="state_pressed">#BB7dbcd3</color>
    <color name="state_focused">#777dbcd3</color>
    <color name="transparent">#00000000</color>
</resources>
person Chanakya Vadla    schedule 07.06.2013

У меня был файл с именем list_selector_background_longpress.9 внутри моей папки с возможностью рисования, в которой была белая фотография с оранжевой линией сверху. Поэтому я заменил его изображением holo_orange_dark цвета, и это решило проблему. Какое до глупости простое решение такой проблемы.

person vergil corleone    schedule 09.06.2013