Страница 1 из 5

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

Добавлено: 19 дек 2011, 03:00
damager82
В этом уроке:

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

Click here to read this article!

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

Добавлено: 11 июл 2012, 14:09
Alexei
Здравствуйте.
Заметил такую штуку.
Компилятор постоянни ругался на слова и комментарии на Русском языке.
т.е. создать массив
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."
Причина ясна нужно включить поддержку Русского языка. Подскажите где? )))
Самое интересное, что если хранить всё в файле ресурсов, то никаких ошибок не возникает и всё выводится на ура )

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

Добавлено: 11 июл 2012, 14:18
rezak90
какую версию андроида используешь? и пробывал ли на разных? я всегда тестирую на 2.3.3 и 4.0.3 то бывают разные ошибки.

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

Добавлено: 11 июл 2012, 14:42
Alexei
сейчас использую 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,
а второй из файла ресурсов?

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

Добавлено: 12 июл 2012, 09:29
damager82
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 и адаптер запросто будет с ним работать.

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

Добавлено: 20 июл 2012, 11:41
powercat
Привет.
Такая штука: урок 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-м уроке - указан...

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

Добавлено: 20 июл 2012, 12:28
KamiSempai
В первом случае мы сами создаем адаптер, а во втором за нас это делает статичный метод createFromResource. Внутри него все тот-же new ArrayAdapter

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

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

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

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

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

Добавлено: 20 июл 2012, 13:31
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);
Зачем писать больше, если не видно разницы?

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

Добавлено: 20 июл 2012, 14:27
powercat
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));

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

Добавлено: 20 июл 2012, 15:41
KamiSempai
В две строчки я для наглядности написал.
Так тоже можно. Но все-равно на 16 символов больше :)

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

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

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

Добавлено: 02 сен 2012, 21:18
top
Помогите с множественным выбором

Создаю Диалог таким способом
здесь же прописываю
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
Подскажите в чем ошибка?

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

Добавлено: 01 окт 2012, 11:46
Dimatrof
Почему неправильно определяются индексы выделенных элементов.В 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);

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

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

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

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

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

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

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

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

Добавлено: 09 окт 2012, 15:41
rezak90
1) ошибка в синтаксисе; - проверьте array файл
2) Eclipse не обновил R.java; - сделайте clean проекту
3) импортирован не тот R.java файл

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

Добавлено: 09 окт 2012, 15:43
Fima777
как сделать clean проекту? спасибо

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

Добавлено: 09 окт 2012, 15:53
rezak90
Project - Clean