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

Не понятное поведение BaseAdapter - Программирование Android

Войти
Регистрация
Восстановить пароль
Другие темы раздела
Программирование Android При перезапуске телефона сбрасывается рекорд http://www.cyberforum.ru/android-dev/thread1241437.html
У меня проблема в игре с рекордом. Создается переменная статическая для счета и для рекорда , рекорд сравнивается с счетом и если счет больше рекорда то перезаписывается, все работает только есть...
Программирование Android Работа с классом View Здравствуйте форумчане, надеюсь все знают этот элемент View. Так вот не знаю как вернуться в начало(( Вроде и на гугле посмотрел и сам попробовал, не один назад и на один элемент вперед есть, а вот... http://www.cyberforum.ru/android-dev/thread1241408.html
Программирование Android Вызов диалога из кнопки в action bar-е
Закинул кнопочку в action bar при нажатии на которую должен создаваться диалог, но вылетает ошибка. Поискав в интернете причины попробовал сменить getApplicationContext() на this ,а также на...
Android. Регистрация разработчика и продавца. Нужно каждый аккаунт отдельно покупать? Программирование Android
То есть за 25$ и 25$ другой? И какая между ними разница?
Программирование Android Динамически созданный элемент по центру http://www.cyberforum.ru/android-dev/thread1241152.html
Как расположить динамически созданный progressbar по центру: ProgressBar progressBar = new ProgressBar(this.getContext(),null,android.R.attr.progressBarStyleLarge); this.addView(progressBar);
Программирование Android Базы данных в андроиде Структура данных примерно такова public class Stat { int id, key_id; List<String> date; List<String> rub_1; List<String> rub_2; } воть загвостка в том что поля могут... подробнее

Показать сообщение отдельно
kvaka
29 / 29 / 3
Регистрация: 26.06.2012
Сообщений: 163
03.02.2015, 23:19
Там система такая. Вообще для отображения элементов вьюх, являющимися позициями списка используется ограниченное число элементов. Т.е., допустим, одновременно на экране может отображаться не более 3х позиций. Для полного функционирования Андроид создает 4 вьюхи (в общем случае, может и больше) - те, которые сейчас на экране и та, которая будет использована для вьюхи, которая появится на экране при скролле. Вьюха, ушедшая за пределы отображаемой области попадает в специальный объект, называемый Recycler, который и использует его для создания нового элемента списка. Поэтому в getView мы и делаем проверку на cjnvertView == null. Т.е. если он null - то у нас нету объекта в ресайклере, который может быть использован для создания позиции списка, соответственно и наполнение у него будет такое, какое при создании инфлейтером из лейаута. В твоем же случае - ты внес в элемен изменение - изменил текст, в этом виде вьюха уехала за экран, далее при создании новой позиции используется та же вьюха. Наполнение текста в getView ты здесь не контролируешь, поэтому он остается таким, каким он уезжал за экран. Таким образом - выводимый на текстВью позиции списка у тебя должен каждый раз доставаться в 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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
public class MYAdapter extends BaseAdapter{
 
    private HashSet<Integer> pressedPositions; // здесь будешь хранить номера нажатых позиций
 
    private List<String> items;
    private LayoutInflater layoutInflater;
    public MYAdapter(Context context, List<String> items) {
        this.items = items;
        this.layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
 
        pressedPositions = new HashSet();
    }
 
    @Override
    public int getCount() {
        return items.size();
    }
 
    @Override
    public String getItem(int position) {
        return items.get(position);
    }
 
    @Override
    public long getItemId(int position) {
        return position;
    }
 
    @Override
    public View getView(final int position, View convertView, final ViewGroup parent) {
        ViewHolder viewHolder;
        if(convertView == null){
            convertView = layoutInflater.inflate(R.layout.item, null);
            viewHolder = new ViewHolder();
            viewHolder.button = (Button) convertView.findViewById(R.id.button);
            viewHolder.textView = (TextView) convertView.findViewById(R.id.text);
            convertView.setTag(viewHolder);
 
            // лисенер достаточно определить один раз для каждого холдера - при его создании
            viewHolder.button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {               
               View rootView = (View) v.getParent();
                TextView txt = (TextView) rootView.findViewById(R.id.text);
                txt.setText("OK");
               pressedPositions.put(position);
            }
        });
 
 
        }else{
            viewHolder = (ViewHolder) convertView.getTag();
            // проверяем нажата ли позиция
            if (!pressedPositions.contains(position)){
                // если не нажата - ставим нужный текст - не знаю какой, но пусть будет так для примера:
                viewHolder.textView.setText(items.get(position));
            }    
        }
        
        return convertView;
    }
    static class ViewHolder{
        Button button;
        TextView textView;
    }
}
В работе не пробовал, но думаю суть понятна.
1
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru