Работаю
6 / 5 / 0
Регистрация: 30.05.2014
Сообщений: 226
1

Множественный выбор в списке

10.09.2014, 22:25. Показов 2475. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Создал список в активити и в отдельном XML файле написал как будет выглядеть этот список с двумя текстовыми строками, но как добавить флажки в виде галочек для множественного выбора, в адаптере жалуется ошибка выходит, вот сам адаптер:
Java
1
2
3
4
5
6
7
8
 SimpleAdapter adapter = new SimpleAdapter(this,
                nPhones,
                R.layout.list, new String[]{ // массив названий
                NPHONE,         //верхний текст
                OPIS,        //нижний теккт
                }, new int[]{    //массив форм
                R.id.text1,      //наш id TextBox'a в list.xml
                R.id.text2});
То есть с обычным списком там просто ставишь simple_list_item_multiple_choice
Но этот список он состоит из отдельной разметки XML, то есть создал listView и его (списка) описание элементов в другом XML файле. В адаптере не прописать simple_list_item_multiple_choice, что делать то?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.09.2014, 22:25
Ответы с готовыми решениями:

Множественный выбор в listview
вот так создается список class AdapterHelper{ String name = {"Первый","Второй","Третий"}; int...

Множественный выбор в Android-приложениях
В общем необходимо сделать Listview с множественным выбором. При этом каждый item из списка должен...

ListView множественный выбор несмотря на SingleChoice mode
Здравствуйте! Столкнулся с проблемой: использую listview со своим Adapter-ом, наследуем от...

Множественный кликабельный текст
Здравствуйте, форумчане! Помогите, пожалуйста, с решением задачи. Имеется ТекстФью в котором я с...

1
28 / 10 / 1
Регистрация: 26.04.2010
Сообщений: 457
11.09.2014, 01:06 2
Ты передал адаптеру кастомную разметку R.layout.list, зачем тогда android.R.simple_list_item_multiple_choice ? В своей разметке добавляй CheckBox в нужном месте. В колбеке onItemClick как вариант можно чекать чекбокс элемента в выбранной позиции. Но в любом случае, если ты захочешь узнать, какие чекбоксы чекнуты, метод getCheckedItemPositions() ListView будет возвращать неверное значение.
А вообще в нестандандартных случаях надо создавать свой адаптер на основе подходящего для данной задачи, и в нём переопределять метод public View getView(int position, View convertView, ViewGroup parent), который вызывается всякий раз, когда необходимо прорисовать вьюхи элемента конкретной позиции, столько, сколько влезает на экран. Т.е. например ты создал свой адаптер с нужным набором данных, после чего выставил этот адаптер для ListView, и автоматически сработал, 7 раз например, колбек getView, в котором ты сам выставляешь содержимое View элементов. Аналогично происходит при прокрутке и при ручном вызове notifyDataSetChanged(), когда это необходимо. Также в филдах можно сделать массив / hashmap / list, содержащий индексы элементов <-> boolean чекнут/не чекнут, и тогда в getView смотря в этот набор данных ты будешь вызывать setChecked(). Для того, чтобы узнать, какие элементы чекнуты, можно просто спросить об этом свой адаптер, получив этот самый набор boolean'ов. Вот на этом примере, надеюсь, будет понятно.

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
83
84
85
86
87
88
89
90
91
92
93
94
95
import java.util.ArrayList;
 
import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.CheckedTextView;
 
public class FoldersArrayAdapter extends ArrayAdapter<String> {
 
    private static final String TAG = "FoldersArrayAdapter";
 
    private final LayoutInflater mInflater;
    // private final Context mContext;
    private final int layout;
    private final ArrayList<String> foldersPathsList;
 
    private final boolean checkedPositions[];
 
    public FoldersArrayAdapter(Context context, int layout, ArrayList<String> foldersList) {
        super(context, layout, foldersList);
        Log.d(TAG, "FoldersArrayAdapter :: FoldersArrayAdapter()");
 
        // mContext = context;
        this.layout = layout;
        foldersPathsList = foldersList;
 
        mInflater = LayoutInflater.from(context);
 
        checkedPositions = new boolean[foldersList.size()];
        for (int i = 0; i < checkedPositions.length; i++) {
            checkedPositions[i] = false;
        }
    }
 
    // if callback getView is overriden, callbacks newView and bindView will not
    // be called
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
 
        // convertView - The old view to reuse, if possible
        // position - The position of the item within
        // listprefs_choice_mode_entry_valuesthe adapter's data set of
        // the item whose view we want.
        // parent - The parent that this view will eventually be attached to
 
        ViewHolder viewHolder;
 
        if (convertView == null) {
 
            if ((layout == android.R.layout.simple_list_item_single_choice)
                    || (layout == android.R.layout.simple_list_item_multiple_choice)) {
                convertView = mInflater.inflate(layout, parent, false);
            } else {
                return null;
            }
 
            viewHolder = new ViewHolder();
            viewHolder.folderNameView = (CheckedTextView) convertView.findViewById(android.R.id.text1);
 
            convertView.setTag(viewHolder);
 
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
 
        if (foldersPathsList != null) {
 
            ViewGroup.LayoutParams layoutParams = viewHolder.folderNameView.getLayoutParams();
            layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT;
            // layoutParams.height = ViewGroup.LayoutParams.WRAP_CONTENT;
            viewHolder.folderNameView.setLayoutParams(layoutParams);
 
            viewHolder.folderNameView.setText(foldersPathsList.get(position));
 
            if (layout == android.R.layout.simple_list_item_multiple_choice) {
                viewHolder.folderNameView.setChecked(checkedPositions[position]);
            }
 
        }
 
        return convertView;
    }
 
    public void setCheckPosition(int position, boolean checked) {
        checkedPositions[position] = checked;
    }
 
    private static class ViewHolder {
        CheckedTextView folderNameView;
    }
 
}
Добавлено через 7 минут
корректировка небольшая

Java
1
2
3
4
5
6
7
8
9
10
11
    private final boolean[] checkedPositions;
 
        public boolean[] getCheckedPositions() {
        return checkedPositions;
        }
 
        public void setCheckPosition(int position, boolean checked) {
                if (position >= 0 && position < checkedPositions.length) {
        checkedPositions[position] = checked;
                }
    }
0
11.09.2014, 01:06
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.09.2014, 01:06
Помогаю со студенческими работами здесь

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

Множественный выбор
Подскажите как реализовать множественный выбор или как правильно сделать.Нужно чтобы в поле...

Множественный выбор
Здравствуйте, подскажите возможно ли проделать такую операцию: в таблице excel имеется поле, где...

Множественный выбор
Здравствуйте, у меня задание определить конец первого предложения, хочу использовать отдельную...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru