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

Программирование Android

Войти
Регистрация
Восстановить пароль
 
arvalon
21 / 6 / 2
Регистрация: 26.10.2012
Сообщений: 160
Записей в блоге: 1
#1

Прорисовка элементов в ListView - Программирование Android

08.07.2016, 00:17. Просмотров 154. Ответов 2
Метки нет (Все метки)

Доброго дня.
Необходимо сделать свой список с своим View, нашёл статью и сделал как в ней. Но поведение CheckBox'ов оказалось поломанное. Если отметить некоторые чекбоксы и пролистать ниже - симметрично через равное количество не отмеченных чекбоксов опять появляются отмеченные! Но я их не отмечал, даже не долистал ни разу ещё до них!
Похоже что пролистывание списка как-то использует ранее созданные элементы и берёт их, не очищая до конца. Но где проблема не могу выявить.
Код адаптера из статьи
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
public class BoxAdapter extends BaseAdapter {
  Context ctx;
  LayoutInflater lInflater;
  ArrayList<Product> objects;
 
  BoxAdapter(Context context, ArrayList<Product> products) {
    ctx = context;
    objects = products;
    lInflater = (LayoutInflater) ctx
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  }
 
  // кол-во элементов
  @Override
  public int getCount() {
    return objects.size();
  }
 
  // элемент по позиции
  @Override
  public Object getItem(int position) {
    return objects.get(position);
  }
 
  // id по позиции
  @Override
  public long getItemId(int position) {
    return position;
  }
 
  // пункт списка
  @Override
  public View getView(int position, View convertView, ViewGroup parent) {
    // используем созданные, но не используемые view
    View view = convertView;
    if (view == null) {
      view = lInflater.inflate(R.layout.item, parent, false);
    }
 
    Product p = getProduct(position);
 
    // заполняем View в пункте списка данными из товаров: наименование, цена
    // и картинка
    ((TextView) view.findViewById(R.id.tvDescr)).setText(p.name);
    ((TextView) view.findViewById(R.id.tvPrice)).setText(p.price + "");
    ((ImageView) view.findViewById(R.id.ivImage)).setImageResource(p.image);
 
    CheckBox cbBuy = (CheckBox) view.findViewById(R.id.cbBox);
    // присваиваем чекбоксу обработчик
    cbBuy.setOnCheckedChangeListener(myCheckChangList);
    // пишем позицию
    cbBuy.setTag(position);
    // заполняем данными из товаров: в корзине или нет
    cbBuy.setChecked(p.box);
    return view;
  }
 
  // товар по позиции
  Product getProduct(int position) {
    return ((Product) getItem(position));
  }
 
  // содержимое корзины
  ArrayList<Product> getBox() {
    ArrayList<Product> box = new ArrayList<Product>();
    for (Product p : objects) {
      // если в корзине
      if (p.box)
        box.add(p);
    }
    return box;
  }
 
  // обработчик для чекбоксов
  OnCheckedChangeListener myCheckChangList = new OnCheckedChangeListener() {
    public void onCheckedChanged(CompoundButton buttonView,
        boolean isChecked) {
      // меняем данные товара (в корзине или нет)
      getProduct((Integer) buttonView.getTag()).box = isChecked;
    }
  };
}
Подскажите, посмотрите. Может проблема скрывается где-то в этих строчках начала метода getView?
Java
1
2
3
4
View view = convertView;
    if (view == null) {
      view = lInflater.inflate(R.layout.item, parent, false);
    }
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.07.2016, 00:17
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Прорисовка элементов в ListView (Программирование Android):

Просмотр элементов в ListView - Программирование Android
нужно что бы при нажатии на элемент открывалось отдельное окно с более детальной информацией данного элемента

Добавление элементов в listview из БД - Программирование Android
Здравствуйте. У меня не выходит выбросить из списка одинаковые элементы. Я из БД вытаскиваю номера групп, которые соответственно...

Вывод элементов ListView в строчку - Программирование Android
Есть вывод данных с базы в ListView : class LoadAllProducts extends AsyncTask&lt;String, String, String&gt; { /** *...

Добавление нескольких элементов в ListView - Программирование Android
Не могу разобрался с ListView.Есть несколько адаптеров как их добавить в ListView?

ListView с изменяющимся количеством элементов - Программирование Android
Нужно реализовать виджет ListView с изменяющимся количеством элементов. Пытался реализовать свой адаптер-наследник от ArrayAdapter и в...

Получение нажатых элементов listview - Программирование Android
Добрый день! Есть listview с кастомным адаптером. В каждом элементе этого listview есть checkbox. Проблема в том что с кастомным...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
petruchodd
90 / 90 / 8
Регистрация: 23.06.2009
Сообщений: 511
08.07.2016, 01:22 #2
при прокрутке адаптер обновляется поэтому и теряются чекбоксы. Тебе нужно хранить где-то в массиве состояние чекбокосв, а адаптер должен как раз по позиции и тянуть с этих массивов.
0
arvalon
21 / 6 / 2
Регистрация: 26.10.2012
Сообщений: 160
Записей в блоге: 1
08.07.2016, 11:37  [ТС] #3
Цитата Сообщение от petruchodd Посмотреть сообщение
при прокрутке адаптер обновляется поэтому и теряются чекбоксы
Они не теряются. Они самоотмечаются!
Я так понимаю состояние чекбокса можно тянуть из данных, оттуда же, откуда берётся содержимое остальных полей элемента View - у меня там есть ещё текстовое поле и картинка. Но у меня нет данных о состоянии отметок чекбоксов при первом запуске списка!
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.07.2016, 11:37
Привет! Вот еще темы с ответами:

Асинхронная загрузка элементов в listview - Программирование Android
Столкнулся с такой проблемой, что у меня есть listview, в который с сайта подгружается список из более чем ста позиций. Хотел бы сделать...

Доступ к содержимому элементов кастомного ListView - Программирование Android
Есть у меня ListView Есть кастомный ListAdapter, который делает элементы аля &quot;TextView - EditText&quot; В общем, тут всё круто, всё...

Свои идентификаторы для элементов ListView - Программирование Android
Как добавить свои идентификаторы в listview для элементов?

Как зафиксировать ширину элементов ListView - Программирование Android
Подскажите как отредактировать разметку элемента ListView. На данный момент есть следующее - checkBox, TextView и ImageView. &lt;?xml...


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

Или воспользуйтесь поиском по форуму:
Ответ Создать тему
Опции темы

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