Урок 43. Одиночный и множественный выбор в ListView

Обсуждение уроков
Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Урок 43. Одиночный и множественный выбор в ListView

Сообщение damager82 » 19 дек 2011, 03:00

В этом уроке:

- используем список ListView для одиночного и множественного выбора элементов

Click here to read this article!
Последний раз редактировалось damager82 02 май 2017, 23:33, всего редактировалось 4 раза.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Alexei
Сообщения: 6
Зарегистрирован: 28 июн 2012, 16:51

Re: Урок 43. Одиночный и множественный выбор в ListView

Сообщение Alexei » 11 июл 2012, 14:09

Здравствуйте.
Заметил такую штуку.
Компилятор постоянни ругался на слова и комментарии на Русском языке.
т.е. создать массив
String[] names = { "Иван", "Марья", "Петр", "Антон", "Даша", "Борис", "Костя", "Игорь", "Анна", "Денис", "Андрей" };
я не мог. при сохранении выдавалась ошибка:
"Save could not be completed. Try File > Save As... if the problem persists.
Reason:
Some characters cannot be mapped using "Cp1252" character encoding.
Either change the encoding or remove the characters which are not supported by the "Cp1252" character encoding."
Причина ясна нужно включить поддержку Русского языка. Подскажите где? )))
Самое интересное, что если хранить всё в файле ресурсов, то никаких ошибок не возникает и всё выводится на ура )

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 43. Одиночный и множественный выбор в ListView

Сообщение rezak90 » 11 июл 2012, 14:18

какую версию андроида используешь? и пробывал ли на разных? я всегда тестирую на 2.3.3 и 4.0.3 то бывают разные ошибки.
R.id.team
Политика на форуме запрещена

Alexei
Сообщения: 6
Зарегистрирован: 28 июн 2012, 16:51

Re: Урок 43. Одиночный и множественный выбор в ListView

Сообщение Alexei » 11 июл 2012, 14:42

сейчас использую 2.2
на самом деле, я просто прохожу уроки по порядку, дабы понять как всё тут устроено, поэтому не особо задумывался о версии.
мне почему-то показалось, что эту проблему можно решить парой галочек в настройках Eclipse.
хотя наверное вы правы, и дело в версии.

кстати. еще такой вопрос.

Код: Выделить всё

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, names);
и

Код: Выделить всё

ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource( this, R.array.names, android.R.layout.simple_list_item_single_choice);
Разница в типе данных, который указывается в треугольных скобках, возникает из-за того, что один адаптер создается на основе нашего массива типа String,
а второй из файла ресурсов?

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 43. Одиночный и множественный выбор в ListView

Сообщение damager82 » 12 июл 2012, 09:29

Alexei писал(а):Разница в типе данных, который указывается в треугольных скобках, возникает из-за того, что один адаптер создается на основе нашего массива типа String, а второй из файла ресурсов?
Метод ArrayAdapter.createFromResource на выходе дает ArrayAdapter<CharSequence>. Поэтому приходится так объявлять переменную.

А когда сами создаем адаптер, просто используем знакомый всем String.

Хотя можно делать и так:

Код: Выделить всё

ArrayAdapter<CharSequence> adapter = new ArrayAdapter<CharSequence>(this, android.R.layout.simple_list_item_1, names);

А в массив names можно сложить String, т.к. String наследует интерфейс CharSequence и адаптер запросто будет с ним работать.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Аватара пользователя
powercat
Сообщения: 508
Зарегистрирован: 20 июл 2012, 11:31

Re: Урок 43. Одиночный и множественный выбор в ListView

Сообщение powercat » 20 июл 2012, 11:41

Привет.
Такая штука: урок 42, код

Код: Выделить всё

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, names);
а урок 43, код

Код: Выделить всё

ArrayAdapter<CharSequence> adapter=ArrayAdapter.createFromResource(this, R.array.names, android.R.layout.simple_list_item_single_choice);
Вопрос - почему в одном случае создается НОВЫЙ объект класса адаптер, а в другом - просто приравнивается...? Для меня это вообще загадка, когда надо какой способ выбирать...Я больше на VB и VBA привык писать под эксель, там там запросто без всех этих NEW можно обойтись, а тут...попа полная )))

Еще вопрос - в этой же строке урока 43 - во второй половине не указывается тип <String> - почему? А в 42-м уроке - указан...

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Урок 43. Одиночный и множественный выбор в ListView

Сообщение KamiSempai » 20 июл 2012, 12:28

В первом случае мы сами создаем адаптер, а во втором за нас это делает статичный метод createFromResource. Внутри него все тот-же new ArrayAdapter

Если заглянуть в документацию, то там сказано, что этот метод возвращает ArrayAdapter<CharSequence>, поэтому в уроке 43 так и написано.
В данной ситуации разницы между CharSequence и String почти ни какой.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Аватара пользователя
powercat
Сообщения: 508
Зарегистрирован: 20 июл 2012, 11:31

Re: Урок 43. Одиночный и множественный выбор в ListView

Сообщение powercat » 20 июл 2012, 12:37

KamiSempai писал(а):В первом случае мы сами создаем адаптер, а во втором за нас это делает статичный метод createFromResource. Внутри него все тот-же new ArrayAdapter

Если заглянуть в документацию, то там сказано, что этот метод возвращает ArrayAdapter<CharSequence>, поэтому в уроке 43 так и написано.
В данной ситуации разницы между CharSequence и String почти ни какой.
А как узнать, когда какой способ использовать?

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Урок 43. Одиночный и множественный выбор в ListView

Сообщение KamiSempai » 20 июл 2012, 13:31

powercat писал(а):А как узнать, когда какой способ использовать?
Зависит от ситуации. В уроке 43 массив хранится в ресурсах и если делать без этого метода, получится вот так:

Код: Выделить всё

CharSequence[] names = getResources().getTextArray(R.array.names);
ArrayAdapter<CharSequence> adapter=new ArrayAdapter<CharSequence>(this, android.R.layout.simple_list_item_1, names);
Зачем писать больше, если не видно разницы?
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Аватара пользователя
powercat
Сообщения: 508
Зарегистрирован: 20 июл 2012, 11:31

Re: Урок 43. Одиночный и множественный выбор в ListView

Сообщение powercat » 20 июл 2012, 14:27

KamiSempai писал(а):
powercat писал(а):А как узнать, когда какой способ использовать?
Зависит от ситуации. В уроке 43 массив хранится в ресурсах и если делать без этого метода, получится вот так:

Код: Выделить всё

CharSequence[] names = getResources().getTextArray(R.array.names);
ArrayAdapter<CharSequence> adapter=new ArrayAdapter<CharSequence>(this, android.R.layout.simple_list_item_1, names);
Зачем писать больше, если не видно разницы?
А разве нельзя вот так написать, в явном виде указать names?

Код: Выделить всё

ArrayAdapter<CharSequence> adapter=new ArrayAdapter<CharSequence>(this, android.R.layout.simple_list_item_1, getResources().getTextArray(R.array.names));

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Урок 43. Одиночный и множественный выбор в ListView

Сообщение KamiSempai » 20 июл 2012, 15:41

В две строчки я для наглядности написал.
Так тоже можно. Но все-равно на 16 символов больше :)
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

suicide
Сообщения: 1
Зарегистрирован: 04 авг 2012, 14:48

Re: Урок 43. Одиночный и множественный выбор в ListView

Сообщение suicide » 12 авг 2012, 16:13

MainActivity не находит R.array.names, т.е. когда я добавляю этот массив в файл хранящий строки, R. файл почему-то не обновляется.

top
Сообщения: 14
Зарегистрирован: 22 июн 2012, 06:09

Re: Урок 43. Одиночный и множественный выбор в ListView

Сообщение top » 02 сен 2012, 21:18

Помогите с множественным выбором

Создаю Диалог таким способом
здесь же прописываю
lv_del_transl.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
чтобы ListView было присвоено свойство множественного выбора

Код: Выделить всё

		final AlertDialog al_del_tr
	        	AlertDialog.Builder  Al_tr = new AlertDialog.Builder(this);
	        	Al_tr.setTitle("Title");
	        	
	        	RelativeLayout view_T = (RelativeLayout)getLayoutInflater().inflate(R.layout.listofword_cmenu_del_transl, null);
	        	Al_tr.setView(view_T);
	        	
	        	
	        	TextView del_transl = (TextView)view_T.findViewById(R.id.del_transl);
	        	ListView lv_del_transl = (ListView)view_T.findViewById(R.id.lv_del_transl);
	            Button del_transl_OK = (Button)view_T.findViewById(R.id.del_transl_OK);
	            Button del_transl_Cancel = (Button)view_T.findViewById(R.id.del_transl_Cancel);
	            
	        	
	        	al_del_tr=Al_tr.create();        	
	    	    
	    	    Del_transl.setText("word");
	    	   
	        
			        Cursor c_adap_tr=cur_del_tr(......);
			        startManagingCursor(c_adap_tr);
			        
			    	String[] from_r = new String[]{NAME};
			    	int[] to_r = new int[] {R.id.transl };
			        scAdapter_transl = new SimpleCursorAdapter(this, R.layout.listofword_cmenu_del_transl_item, c_adap_tr, from_r, to_r);
			       lv_del_transl.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
			        lv_del_transl.setAdapter(scAdapter_transl);

         del_transl_OK.setOnClickListener(new View.OnClickListener() {
					
					public void onClick(View v) {
						String sel="0";

						SparseBooleanArray sbArray = lv_del_transl.getCheckedItemPositions();
					    for (int i = 0; i < lv_del_transl.getCount(); i++) {
					      int key = sbArray.keyAt(i);
					      if (sbArray.get(i))
					        sel+=Integer.toString(lv_del_transl.getCheckedItemPosition())+" ";
					    }
					    Toast.makeText(getApplicationContext(), Integer.toString(lv_del_transl.getCount())+" "+sel, Toast.LENGTH_SHORT).show();
						
				
					}
				});
....      

     al_del_rt.show();


Xml файл
в ListViev дописываю свойство
android:choiceMode="multipleChoice"

Код: Выделить всё

<?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout 
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="290dp"
        android:layout_height="wrap_content"
        android:orientation="vertical"
         >




        <LinearLayout
            android:id="@+id/lv_del_translation"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:padding="5dp" >

            <TextView
                android:id="@+id/del_translation"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:text="@string/text_del_translation"
                android:textSize="20dp" />

            <TextView
                android:id="@+id/del_transl"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:layout_marginTop="28dp"
                android:text="@string/text_del_transl"
                android:textSize="20dp" />

        </LinearLayout>
           

              <ListView
                android:id="@+id/lv_del_transl"
                android:layout_below="@+id/lv_del_translation"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="10dp"
                android:layout_weight="1" 
               android:choiceMode="multipleChoice"
                />

        
    


        <LinearLayout
            android:id="@+id/l_del_buttons"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_gravity="center"
            android:background="@drawable/gradient_box"
            android:orientation="horizontal"
            android:padding="5dp" 
            >
            
            <Button
                android:id="@+id/del_transl_OK"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="@string/text_del_word_OK"
                 />

            <Button
                android:id="@+id/del_transl_Cancel"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="@string/text_del_word_Cancel"
                />
            
            
            
        </LinearLayout>
    
        
        

 </RelativeLayout>
где R.layout.listofword_cmenu_del_transl_item

Код: Выделить всё

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:orientation="horizontal">
 
<TextView
 android:id="@+id/transl"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_marginLeft="20dp"
 android:layout_centerVertical="true"
 android:textSize="19sp">
</TextView>

<CheckBox 
    android:id="@+id/checbox_id"
    android:layout_marginRight="10dp"
    android:layout_alignParentRight="true"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    />



 </RelativeLayout> 


Ощущение, что SparseBooleanArray sbArray никакого эффекта не дает.
Т.е. при выборе нескольких CheckBox и нажатии Button получается, что игнорируется выбор CheckBox
Подскажите в чем ошибка?

Dimatrof
Сообщения: 9
Зарегистрирован: 14 авг 2012, 19:52
Откуда: Мордовия

Re: Урок 43. Одиночный и множественный выбор в ListView

Сообщение Dimatrof » 01 окт 2012, 11:46

Почему неправильно определяются индексы выделенных элементов.В LogСat получаю следующее
checked:
-1
-1
-1

Код: Выделить всё

public void onClick(View arg0) {
        // пишем в лог выделенные элементы
        Log.d(LOG_TAG, "checked: ");
        SparseBooleanArray sbArray = lvMain.getCheckedItemPositions();
        for (int i = 0; i < sbArray.size(); i++) {
          int key = sbArray.keyAt(i);
          if (sbArray.get(key))
            Log.d(LOG_TAG, String.valueOf(lvMain.getCheckedItemPosition()));
        }
      }
в адаптере использовал ArrayList

Код: Выделить всё

ArrayList<String> con=new ArrayList<String>();
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(
            this,
            android.R.layout.simple_list_item_multiple_choice,con);

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 43. Одиночный и множественный выбор в ListView

Сообщение damager82 » 02 окт 2012, 10:28

Dimatrof писал(а):Почему неправильно определяются индексы выделенных элементов.
У вас множественный выбор?
Метод getCheckedItemPosition используется для получения индекса при одиночном выборе.
В уроке немного другой код, чем ваш:
вместо
lvMain.getCheckedItemPosition()
используется
names[key]
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Dimatrof
Сообщения: 9
Зарегистрирован: 14 авг 2012, 19:52
Откуда: Мордовия

Re: Урок 43. Одиночный и множественный выбор в ListView

Сообщение Dimatrof » 04 окт 2012, 15:13

damager82 писал(а):
Dimatrof писал(а):Почему неправильно определяются индексы выделенных элементов.
У вас множественный выбор?
Метод getCheckedItemPosition используется для получения индекса при одиночном выборе.
В уроке немного другой код, чем ваш:
вместо
lvMain.getCheckedItemPosition()
используется
names[key]
ок.спасибо, с этим разобрался.

Fima777
Сообщения: 30
Зарегистрирован: 14 сен 2012, 13:39

Re: Урок 43. Одиночный и множественный выбор в ListView

Сообщение Fima777 » 09 окт 2012, 15:29

MainActivity не находит R.array.names , почему то подчёркивает array крассной линией и пишет "array cannot be resolved or is not a field"

в чём тут проблема?

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 43. Одиночный и множественный выбор в ListView

Сообщение rezak90 » 09 окт 2012, 15:41

1) ошибка в синтаксисе; - проверьте array файл
2) Eclipse не обновил R.java; - сделайте clean проекту
3) импортирован не тот R.java файл
R.id.team
Политика на форуме запрещена

Fima777
Сообщения: 30
Зарегистрирован: 14 сен 2012, 13:39

Re: Урок 43. Одиночный и множественный выбор в ListView

Сообщение Fima777 » 09 окт 2012, 15:43

как сделать clean проекту? спасибо

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 43. Одиночный и множественный выбор в ListView

Сообщение rezak90 » 09 окт 2012, 15:53

Project - Clean
R.id.team
Политика на форуме запрещена

Ответить