Форум программистов, компьютерный форум CyberForum.ru

Индексация внутри ListView - Android

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 5.00
asmproger
2 / 2 / 0
Регистрация: 06.08.2012
Сообщений: 33
24.04.2013, 15:15     Индексация внутри ListView #1
Всем привет.
Возникла проблема с ListView.
Задача - построить список по json - данным, которые прилетают с сервера.
Данные - элементы списка и разделители (элемент с доп. параметром).
Нужно построить список, в котором разделители будут отличаться внешне.

Вот метод getView адаптера
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
    public View getView(int position, View convertView, ViewGroup parent) {
        View rowView = convertView;
        Typeface font = Typeface.createFromAsset( act.getAssets(), "fontawesome-webfont.ttf" );
        MenuItemHolder viewHolder;
        if (rowView == null) {
            rowView = act.getLayoutInflater().inflate(R.layout.slidemenu_listitem, null);
            
            viewHolder = new MenuItemHolder();
            viewHolder.title = (TextView) rowView.findViewById(R.id.dashboard_item_title);
            viewHolder.font_icon = (TextView) rowView.findViewById(R.id.dashboard_item_font_icon);
 
            viewHolder.font_icon.setTypeface(font);
            
            if(itemFont != null) {
                viewHolder.title.setTypeface(itemFont);
            }
            
            rowView.setTag(viewHolder);
        }
        
        viewHolder = (MenuItemHolder) rowView.getTag();
        viewHolder.title.setTag(position);
        
        String s = items[position].label;
        viewHolder.title.setText(s);
        
        String font_icon = "";
        try {
            font_icon = act.getResources().getString(
                    font_icons.get(items[position].font_icon)
                    );
        } catch (Exception e) {
            font_icon = "";
        }
        viewHolder.font_icon.setText( font_icon );
 
        int is = dividers.indexOf((int) items[position].id);
                
        
        if(items[position].data_type != null) {
            if( items[position].data_type.equals("list-divider") ) {
                viewHolder.title.setText("");
                viewHolder.title.setBackgroundColor(act.getResources().getColor(R.color.delimiterColor));
            }
        }
        return rowView;
    }
Сначала все работает как надо, но если список длинный, то после прокручивания меняются самые разные элементы. И получается вместо 3 разделителей - 6 и больше.
Судя по всему, что-то не так с определением индекса элемента. Второй день не могу понять, в чем проблема.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.04.2013, 15:15     Индексация внутри ListView
Посмотрите здесь:

Android ViewPager внутри ListView, Как вставить?
Android spinner в ListView
Цикл по ListView Android
Android C JSON в ListView
Стиль ListView Android
Android Кастомизация ListView
Ссылки (<a href="LINK">XXX</a>) внутри ListView Android
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
V0v1k
1157 / 981 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
24.04.2013, 18:17     Индексация внутри ListView #2
а где у вас эти разделители добавляются?
NiRamz
210 / 210 / 16
Регистрация: 26.12.2010
Сообщений: 691
24.04.2013, 20:50     Индексация внутри ListView #3
Подобный глюк есть (когда с текстом идет работа, такого нет.. но стоит начать работу с изображением или цветом элемента, появляется эта проблема .. хз почему), попробуйте ради теста добавить else.
V0v1k
1157 / 981 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
24.04.2013, 20:55     Индексация внутри ListView #4
не понятна суть проблемы.
если вы как-то меняете view айтема для определенных индексов, то нужно предусмотреть отмену изменений для остальных индексов.
NiRamz
210 / 210 / 16
Регистрация: 26.12.2010
Сообщений: 691
24.04.2013, 20:59     Индексация внутри ListView #5
Цитата Сообщение от V0v1k Посмотреть сообщение
не понятна суть проблемы.
если вы как-то меняете view айтема для определенных индексов, то нужно предусмотреть отмену изменений для остальных индексов.
я так понял у человека проблема в этом участке кода:
Java
1
2
3
4
if( items[position].data_type.equals("list-divider") ) {
                viewHolder.title.setText("");
                viewHolder.title.setBackgroundColor(act.getResources().getColor(R.color.delimiterColor));
            }
то есть вы правильно написали, вместо 3 к примеру итемов, цвет меняется после прокрутки в большинстве.
V0v1k
1157 / 981 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
24.04.2013, 21:05     Индексация внутри ListView #6
NiRamz, ну тогда вы праве, нужно добавить else в котором будет задаваться цвет для остальных индексов.
asmproger
2 / 2 / 0
Регистрация: 06.08.2012
Сообщений: 33
25.04.2013, 08:37  [ТС]     Индексация внутри ListView #7
NiRamz, да, проблема имено там
Насчет else, честно говоря, даже в голову не приходило. Думал, с индексами какие-нибудь хитрые заморочки.
И действительно, с текстом проблем не возникает.
Всем спасибо за советы, сейчас буду исправлять.

Добавлено через 2 часа 17 минут
Теперь проблема изменилась.
В шаблоне я назначаю listview свойство listSelector, чтобы при нажатии на элемент списка менялся цвет и шрифт.
Если назначать эти параметры насильно, при нажатии ничего не изменится.
Теперь, получается, всем элементам насильно назначается цвет фона, и при нажатии ничего не меняется.
У linearlayout есть метод setBackground(Drawable d), видимо это то, что нужно. но он требует поддержки api от 16, а поддерживать нужно начиная со второй версии андроида.
Возможно ли как-то обойти эти ограничения?
NiRamz
210 / 210 / 16
Регистрация: 26.12.2010
Сообщений: 691
25.04.2013, 10:03     Индексация внутри ListView #8
вместо этого
Цитата Сообщение от NiRamz Посмотреть сообщение
viewHolder.title.setBackgroundColor(act.getResources().getColor(R.color.delimiterColor));
используйте
Java
1
holder.txt.setBackgroundDrawable(activity.getResources().getDrawable(R.id.your_xml));
текст your_xml будет примерно такой

XML
1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:state_enabled="false" android:state_focused="true"
        android:drawable="@drawable/item_disabled" />
  <item android:state_pressed="true"
        android:drawable="@drawable/item_pressed" />
  <item android:state_focused="true"
        android:drawable="@drawable/item_focused" />
</selector>
asmproger
2 / 2 / 0
Регистрация: 06.08.2012
Сообщений: 33
30.04.2013, 09:27  [ТС]     Индексация внутри ListView #9
Все равно проблемы с фоном.
Listview создается таким кодом
XML
1
2
3
4
5
6
7
8
9
<ListView
            android:id="@+id/menu_listview"
            style="@style/dashboard"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:divider="@android:color/darker_gray"
            android:dividerHeight="1dip" 
            android:listSelector="@drawable/listselector"
            />
Listselector
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<selector
    android:id="@+id/myselector"
    xmlns:android="http://schemas.android.com/apk/res/android" >
 
    <item 
        android:state_focused="true"  
        android:state_enabled="false" 
        android:state_pressed="true" 
        android:drawable="@color/dashboard_item_hover" />
    
    <item 
        android:state_focused="true"  
        android:state_enabled="false"                              
        android:drawable="@color/dashboard_item_hover" />
    
    <item 
        android:state_focused="true"                                
        android:state_pressed="true" 
        android:drawable="@color/dashboard_item_hover" />
    
    <item 
        android:state_focused="false"                               
        android:state_pressed="true" 
        android:drawable="@color/dashboard_item_hover" />
    
    <item android:state_focused="true"                                                             
        android:drawable="@color/dashboard_item_hover" />
 
</selector>
Элемент списка
XML
1
2
3
4
5
6
7
8
    <TextView
        android:id="@+id/dashboard_item_title"
        style="@style/dashboard_item_style"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:layout_marginLeft="5dip"
        android:textColor="@drawable/dashboard_item" />
Dashboard_item drawable
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<selector
    android:id="@+id/dashboard_item_selector"
    xmlns:android="http://schemas.android.com/apk/res/android" 
    >
 
    <item android:state_focused="false"
        android:state_pressed="false"
        android:state_enabled="true"
        android:color="@color/textColor" />
     
    
    <item android:state_focused="true"  
        android:state_enabled="false" 
        android:state_pressed="true"
        android:color="@color/white" />
 
    <item 
        android:state_focused="true"  
        android:state_enabled="false"                              
        android:color="@color/white" />
    
    <item 
        android:state_focused="true"                                
        android:state_pressed="true" 
        android:color="@color/white" />
    
    <item 
        android:state_focused="false"                               
        android:state_pressed="true" 
        android:color="@color/white" />
    
    <item android:state_focused="true"                                                             
        android:color="@color/white" />
 
</selector>
При нажатии на элемент меняется фон и цвет текста. Но это назначается всем элементам, включая разделители.
В адаптере делаю так
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
if (items[position].data_type != null) {
            if (items[position].data_type.equals("list-divider")) {
                if (s.indexOf("nbsp") >= 0) {
                    viewHolder.title.setText("");
                }
                viewHolder.title.setTextSize(14);
                rowView.setBackgroundDrawable(act.getResources().getDrawable(R.drawable.divider_listselector));
            } else {
                viewHolder.title.setTextSize(18);
                rowView.setBackgroundDrawable(act.getResources().getDrawable(R.drawable.listselector));
            }
        } else {
            viewHolder.title.setTextSize(18);
            rowView.setBackgroundDrawable(act.getResources().getDrawable(R.drawable.listselector));
        }
Где divider_listselector
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<selector
    android:id="@+id/divider_myselector"
    xmlns:android="http://schemas.android.com/apk/res/android" >
 
    <item 
        android:state_focused="true"
        android:state_enabled="false"
        android:state_pressed="true"
            
        android:textSize="14px"
        android:color="@color/textColor"            
        android:drawable="@color/delimiterColor" 
    />
    
    <item 
        android:state_focused="true"
        android:state_enabled="false"
        
        android:textSize="14px"
        android:color="@color/textColor"
        android:drawable="@color/delimiterColor"
     />
    
    <item 
        android:state_focused="true"
        android:state_pressed="true"
        
        android:textSize="14px"
        android:color="@color/textColor"
        android:drawable="@color/delimiterColor"
    />
    
    <item 
        android:state_focused="false"
        android:state_pressed="true"
        
        android:textSize="14px"
        android:color="@color/textColor"
        android:drawable="@color/delimiterColor"
    />
    
    <item android:state_focused="true"
        
        android:textSize="14px"
        android:textColor="@color/textColor"         
        android:drawable="@color/delimiterColor"
     />
 
</selector>
В результате - элементы списка (не разделители) ведут себя как надо. Разделители, при нажатии, меняют фон (на нужный), и цвет текста (это вообще не нужно). Нужно, чтобы разделители имели фиксированный фон и цвет текста, независимо от нажатия.

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

Добавлено через 1 час 14 минут
Всем спасибо, проблема решена.
Решил не париться, и сделать два разных шаблона (layout) для элементов списка и разделителей. Сработало.
asmproger
2 / 2 / 0
Регистрация: 06.08.2012
Сообщений: 33
23.05.2013, 11:18  [ТС]     Индексация внутри ListView #10
Новая проблема.
Решил не создавать новую тему, т.к. так же связана с ListView.
Начал тестировать приложение на android 2.3.6, обнаружилось неприятное - при прокрутке listview цвет меняется на белый для всех элементов. Как только прокрутка оканчивается, цвет меняется на нужный.
Это было решено добавлением строки
XML
1
android:scrollingCache="false"
в определение ListView.
Вторая проблема - при выборе элемента точно так же все элементы на время нажатия меняют цвет на активный.
В чем может быть проблема?
V0v1k
1157 / 981 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
23.05.2013, 11:46     Индексация внутри ListView #11
Цитата Сообщение от asmproger Посмотреть сообщение
Вторая проблема - при выборе элемента точно так же все элементы на время нажатия меняют цвет на активный.
никогда с таким не сталкивался, похоже вы где-то накосячили...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.05.2013, 12:53     Индексация внутри ListView
Еще ссылки по теме:

Android Как обратиться к элементу (button) внутри пункта списка (ListView)
Spinner внутри ListView Android
Получить доступ к TextView внутри ListView Android
EditText.Listener внутри ListView Android
Android Для чего производится индексация Андроид-приложений?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
asmproger
2 / 2 / 0
Регистрация: 06.08.2012
Сообщений: 33
23.05.2013, 12:53  [ТС]     Индексация внутри ListView #12
На 4 версии все нормально, нажимаю на элемент - он меняет цвет, отпускаю - все возвращается, а на 2 такая фигня вылезла.
Какая-то несовместимость версий API
Yandex
Объявления
23.05.2013, 12:53     Индексация внутри ListView
Ответ Создать тему
Опции темы

Текущее время: 06:56. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru