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

Слушатели списка со своей разметкой - Android

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
kvaka
 Аватар для kvaka
29 / 29 / 3
Регистрация: 26.06.2012
Сообщений: 163
09.07.2012, 00:21     Слушатели списка со своей разметкой #1
Вопрос вот в чем:
создаю ListView, создаю адаптер, работающий с моей разметкой.
Потом подключаю адаптер - все показывает отлично.
Начинаю привязывать OnItemClickListener - и он молчит.
Если я использую не элемент со своей разметкой, а стандартный android.R.layout.simple_list_item_l,
то все нормально-выделенные элементы выделяются рамочкой, слушатель реагирует. Навязывается вывод, что все потому, что я пользуюсь своим адаптером...
Вопрос: Как заставить ListView с моим адаптером реагировать на OnItemClickListener?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.07.2012, 00:21     Слушатели списка со своей разметкой
Посмотрите здесь:

Android Создание блока Лэйаутов со своей структурой из кода
Android Позвонить из своей программы
Android Положение своей клавиатуры на экране с полем ввода, спрятать клавиатуру
Как убрать preview клавиш со своей клавиатуры? Android
Google Maps - автоматическое обновление своей GPS-позиции внутри MapsActivity Android
Android Подскажите с разметкой
Android Настроить в своей программе платный контент
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
V0v1k
1157 / 981 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
09.07.2012, 00:35     Слушатели списка со своей разметкой #2
Все должно работать. Выложите свой проект.
kvaka
 Аватар для kvaka
29 / 29 / 3
Регистрация: 26.06.2012
Сообщений: 163
09.07.2012, 01:27  [ТС]     Слушатели списка со своей разметкой #3
Для упрощения понимания данного вопроса взял пример из книги Галощапова и переделал его под свои нужды. Вот код адаптера


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
package com.samples.mytest01;
 
import java.util.List;
 
import android.content.Context;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.LinearLayout;
import android.widget.TextView;
 
public class ListArratAdapter extends ArrayAdapter<String>{
    
    int resource;
 
    public ListArratAdapter(Context context, int _resource,
            String[] items) {
        super(context, _resource, items);
        
        resource=_resource; 
    }
    
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        
        LinearLayout ListItemView;
        
        String item=getItem(position);
    
        if (convertView==null){
            ListItemView=new LinearLayout(getContext());
            String inflater=Context.LAYOUT_INFLATER_SERVICE;
            LayoutInflater vi=(LayoutInflater)getContext().getSystemService(inflater);
            vi.inflate(resource, ListItemView, true);
        } else {
            ListItemView=(LinearLayout)convertView;
        }
        TextView nameView= (TextView) ListItemView.findViewById(R.id.item_name);
        nameView.setText(item); 
        return ListItemView;
    }
 
}
Вот код разметки элемента списка:
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
<?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="horizontal" 
    android:background="@android:color/transparent">
  
        <TextView 
            android:id="@+id/item_name"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_margin="2dp"
            android:layout_alignParentLeft="true"
        />
        
        <CheckBox 
            android:id="@+id/checkbox"
            android:layout_width="wrap_content"
            android:layout_height="fill_parent"
            android:layout_margin="2dp"
            android:layout_alignParentRight="true"
        />
        
</RelativeLayout>
Вот основная активити:

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
package com.samples.mytest01;
 
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
 
public class MyTest01Activity extends Activity {
    
    private TextView mTextView;
    
    String[] mContacts = {
        "Jacob Anderson", "Emily Duncan", "Michael Fuller", 
        "Emma Greenman", "Joshua Harrison", "Madison Johnson",
        "Matthew Cotman", "Olivia Lawson", "Andrew Chapman", 
        "Daniel Honeyman", "Isabella Jackson", "William Patterson", 
        "Joseph Godwin", "Samantha Bush", "Christopher Gateman"}; 
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        ListView listView=(ListView)findViewById(R.id.list);
        
        listView.setAdapter(new ListArratAdapter(this, R.layout.list_item_layout, mContacts));
        
        
        mTextView = (TextView)findViewById(R.id.textSelect);
        
        listView.setOnItemClickListener(new OnItemClickListener() {
 
            public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                    long arg3) {
                mTextView.setText("Select: " + mContacts[arg2] + " " +arg2 + " " + arg3);
                
            }
        });
        
    }
V0v1k
1157 / 981 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
09.07.2012, 03:39     Слушатели списка со своей разметкой #4
Хм, присутствие CheckBox'a как-то влияет на кликабельность итемов.
А вообще для таких списков существуют такие штуки как:
new ArrayAdapter<String>(context, android.R.layout.simple_list_item_multiple_choice, values);
и
CheckedTextView

Добавлено через 32 минуты
еще глянь это - http://windrealm.org/tutorials/andro...stactivity.php

Добавлено через 23 минуты
о, если к CheckBox добавить android:focusable="false", то итем стает кликабельным.
kvaka
 Аватар для kvaka
29 / 29 / 3
Регистрация: 26.06.2012
Сообщений: 163
10.07.2012, 01:33  [ТС]     Слушатели списка со своей разметкой #5
Мужик, ты-мозг! ))

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

для данных в адаптере я использую свой класс:
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
package com.gg.top100;
 
 
public class ListItem {
    
    private String name;
    private String pictureName;
    private String description;
    private boolean checkFlag=false;
 
    public ListItem(String _name, String _pictureName, String _desription){
        name=_name;
        pictureName=_pictureName;
        description=_desription;        
    }
    
    
    public String getName(){
        return name;
    }
    
    public String getPictureName(){
        return pictureName;
    }
    
    public String getDescription(){
        return description;
    }
    
    public boolean getCheckFlag(){
        return checkFlag;
    }
    
    public void checkItem(){
        checkFlag=true;
    }
В свой адаптер в метод getView добавляю проверку значения checkFlag для моего элемента и если true, то ставлю галку:

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
48
49
50
51
52
53
54
55
56
57
58
59
package com.gg.top100;
 
import java.util.List;
 
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.LinearLayout;
import android.widget.TextView;
 
public class ListArratAdapter extends ArrayAdapter<ListItem>{
    
    int resource;
 
    public ListArratAdapter(Context context, int _resource,
            List<ListItem> items) {
        super(context, _resource, items);
        
        resource=_resource; 
    }
    
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        
        LinearLayout ListItemView;
        CheckBox checkBox;
        ListItem item=getItem(position);
        
        String itemName=item.getName();
    
        if (convertView==null){
            ListItemView=new LinearLayout(getContext());
            String inflater=Context.LAYOUT_INFLATER_SERVICE;
            LayoutInflater vi=(LayoutInflater)getContext().getSystemService(inflater);
            vi.inflate(resource, ListItemView, true);           
        } else {
            ListItemView=(LinearLayout)convertView;
        }
        
        TextView nameView= (TextView) ListItemView.findViewById(R.id.item_name);
        checkBox=(CheckBox)ListItemView.findViewById(R.id.checkbox);
        checkBox.setFocusable(false);
        checkBox.setClickable(false);
        
        nameView.setText(itemName);
            
        if (item.getCheckFlag()){       
        checkBox.setChecked(true);  
        
        }
        return ListItemView;
    }
    
 
}
В своей активити в onItemClickListener добавляем пару строк
Java
1
2
3
4
5
6
7
8
 public void onItemClick(AdapterView<?> parent, View v, int position,
                    long id) {
                
                 
                if (!itemList.get(position).getCheckFlag()){
                    itemList.get(position).checkItem();
                }
}
(itemList - это массив адаптера)

При таком раскладе галки все же появляются, но непонятно по какому принципу. Все элементы списка, которые видны всегда - всегда без галок....
пробовал вставлять куда мог invalidate() - не помогло... отсюда вывод - я что-то не так сделал.

И, кстати, еще - где можно переопределить выделяющий маркер списка - надо сделать рамку, ато этот жуткий оранжевый прямоугольник загораживает содержимое позиции...
V0v1k
1157 / 981 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
10.07.2012, 01:49     Слушатели списка со своей разметкой #6
Цитата Сообщение от V0v1k Посмотреть сообщение
Вот же линк дал на такую же штуку, что ты делаешь...
kvaka
 Аватар для kvaka
29 / 29 / 3
Регистрация: 26.06.2012
Сообщений: 163
10.07.2012, 02:53  [ТС]     Слушатели списка со своей разметкой #7
блин, тупонул...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.07.2012, 13:45     Слушатели списка со своей разметкой
Еще ссылки по теме:

Android Не могу разобраться с разметкой xml - layout'a
Поиск своей проги на google play Android
Android Ошибка с xml разметкой после добавления Drawer
Коммерческое использование музыки в своей игре Android
Написание простой своей звонилки Android

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

Или воспользуйтесь поиском по форуму:
kvaka
 Аватар для kvaka
29 / 29 / 3
Регистрация: 26.06.2012
Сообщений: 163
12.07.2012, 13:45  [ТС]     Слушатели списка со своей разметкой #8
Вроде разобрался с примером и все заработало, но вот с отдельными вещами не очень понятно, и в нете что-то не очень толково расписано. В общем наибольший интерес для меня представляет конструкция в адаптере:
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
    public View getView(int position, View convertView, ViewGroup parent) {
        
        LinearLayout ListItemView;      
        CheckBox checkBox;
        TextView nameView;      
        ListItem item=getItem(position);    
        String itemName=item.getName();
    
        if (convertView==null){
            convertView=layoutInflater.inflate(resource, null);         
            checkBox=(CheckBox) convertView.findViewById(R.id.checkbox);
            nameView=(TextView) convertView.findViewById(R.id.item_name);           
            convertView.setTag(new ItemViewHolder(nameView, checkBox));         
            checkBox.setClickable(false);
            checkBox.setFocusable(false);   
        } else {
            ItemViewHolder viewHolder=(ItemViewHolder) convertView.getTag();
            checkBox=viewHolder.getCheckBox();
            nameView=viewHolder.getItemName();
        }           
            checkBox.setChecked(item.getCheckFlag());
            nameView.setText(item.getName());           
        return convertView;
    }
а конкретно строчка

Java
1
convertView.setTag(new ItemViewHolder(nameView, checkBox));
я так понял, что здесь каждой строчке в списке передается анонимный ассоциативный объект типа ItemViewHolder, т. е. наш объект ItemViewHolder оказывается прицепом с информацией к конкретному convertView. Так?
Далее строкой
Java
1
ItemViewHolder viewHolder=(ItemViewHolder) convertView.getTag();
мы вызываем иформационный объект ItemViewHolder к выбранному convertView.
Правильно я понял?

В примере это названо оптимизацией:
Java
1
2
// Optimization: Tag the row with it's child views, so we don't have to   
        // call findViewById() later when we reuse the row.
Однако на http://developer.android.com написано:
It is generally preferable to use IDs (through the android:id attribute) instead of tags because they are faster and allow for compile-time type checking.
Что, как я понимаю, говорит об обратном, во всяком случае в плане производительности. Или в данном случае под оптимизацией имеется ввиду отсутствие необходимости присвоения имени для элементов View, отображающих элемент списка?
Yandex
Объявления
12.07.2012, 13:45     Слушатели списка со своей разметкой
Ответ Создать тему
Опции темы

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