Урок 44. События в ListView

Обсуждение уроков
ligaron
Сообщения: 5
Зарегистрирован: 17 июн 2013, 20:16

Re: Урок 44. События в ListView

Сообщение ligaron » 17 июн 2013, 21:10

anber писал(а): Т.е. элементы списка состоят не просто из TextView, а из LinearLayout который внутри себя содержит TextView?
Так точно, несколько TextView'ов, каждый из которых имеет свой ID
anber писал(а): В таком случае необходимо задать TextView какой-то ID в xml файле, и потом получить это TextView можно методом view.findViewById(R.id.my_id);
Вот тут не понял :-(. ID'шники заданы, но я не знаю по какому элементу было нажатие, чтобы его искать. Вы предлагаете завести где-то еще один идентификатор?

Аватара пользователя
anber
Сообщения: 584
Зарегистрирован: 10 июн 2013, 15:05
Откуда: UA

Re: Урок 44. События в ListView

Сообщение anber » 17 июн 2013, 21:18

ligaron писал(а):В таком случае необходимо задать TextView какой-то ID в xml файле, и потом получить это TextView можно методом view.findViewById(R.id.my_id);
Вот тут не понял :-(. ID'шники заданы, но я не знаю по какому элементу было нажатие, чтобы его искать. Вы предлагаете завести где-то еще один идентификатор?[/quote]

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

public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
  TextView textView1 = (TextView) view.findViewById(R.id.tvText1);
  TextView textView2 = (TextView) view.findViewById(R.id.tvText2);

  // дальше textView1.setText("test") etc...

}
Последний раз редактировалось anber 17 июн 2013, 21:22, всего редактировалось 1 раз.
Личные сообщения с просьбой ответить на форуме или написать программу я просто удаляю, если я в хорошем настроении. Если в плохом добавляю автора в черный список. По любым другим вопросам feel free to write to me.

Аватара пользователя
anber
Сообщения: 584
Зарегистрирован: 10 июн 2013, 15:05
Откуда: UA

Re: Урок 44. События в ListView

Сообщение anber » 17 июн 2013, 21:22

ligaron писал(а):можно ли в методе onItemClick как-то получить идентификатор именно того TextView (в строке элемента списка), на котором было нажатие?
Если вы расскажите в общих чертах что вы хотите сделать, то будет проще помочь.

Пример рассказа:
Я хочу сделать менеджер контактов. О представляет собой список список элементов которые содержат TextView для имени и TextView для фамилии и кнопку "сохранить" под списком. По клику на кнопку сохранить все измененные контакты сохраняются
Личные сообщения с просьбой ответить на форуме или написать программу я просто удаляю, если я в хорошем настроении. Если в плохом добавляю автора в черный список. По любым другим вопросам feel free to write to me.

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 44. События в ListView

Сообщение Foenix » 17 июн 2013, 21:29

ты хочешь отловить на имя или на фамилию было нажатие?
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

ligaron
Сообщения: 5
Зарегистрирован: 17 июн 2013, 20:16

Re: Урок 44. События в ListView

Сообщение ligaron » 17 июн 2013, 21:39

anber писал(а): Пример рассказа:
Я хочу сделать список, каждая строка которого представлена 2-мя TextView'ами, один в левой части строки, другой в правой.
Например:
----------------------------
ЛевыйТекст1 ПравыйТекст1
----------------------------
ЛевыйТекст2 ПравыйТекст2
----------------------------
ЛевыйТекст3 ПравыйТекст3
----------------------------
Если я кликну по второй строке списка, то хочу чтобы программа мне сказала, пришлось ли мое нажатие на "ЛевыйТекст2" или "ПравыйТекст2" (тоесть, интересует, в какой части строки я это сделал). Получить сам текст по ID я могу, мне нужно определить сам ID!

Вот где-то такая рассказа :-)

ligaron
Сообщения: 5
Зарегистрирован: 17 июн 2013, 20:16

Re: Урок 44. События в ListView

Сообщение ligaron » 17 июн 2013, 21:40

Foenix писал(а):ты хочешь отловить на имя или на фамилию было нажатие?
О, в точку!!! Да!

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

Re: Урок 44. События в ListView

Сообщение rezak90 » 17 июн 2013, 22:12

ligaron писал(а):
Foenix писал(а):ты хочешь отловить на имя или на фамилию было нажатие?
О, в точку!!! Да!
повесить по OnClickListener'y на каждый TextView, в чём проблема?
R.id.team
Политика на форуме запрещена

ligaron
Сообщения: 5
Зарегистрирован: 17 июн 2013, 20:16

Re: Урок 44. События в ListView

Сообщение ligaron » 17 июн 2013, 22:40

rezak90 писал(а):повесить по OnClickListener'y на каждый TextView, в чём проблема?
И где их вешать? В getView CustomAdapter?
Если просто добавить в list_item.xml в описании TextView
android:onClick="onClick"
android:clickable="true"
то в обработчике я получаю только View v

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

public void onClick(View v) {
	Log.i("Click", "" + v.getId());
}
Но не получаю таких параметров как, в какой строке списка нажатие (как это было в onItemClick(AdapterView<?> parent, View view, int position, long id)).

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 44. События в ListView

Сообщение Foenix » 17 июн 2013, 23:13

в предыдущем уроке была обработка клика на checkbox-е, это ж почти одно и то же..
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

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

Re: Урок 44. События в ListView

Сообщение rezak90 » 17 июн 2013, 23:31

ligaron писал(а):И где их вешать? В getView CustomAdapter?
да
R.id.team
Политика на форуме запрещена

Аватара пользователя
anber
Сообщения: 584
Зарегистрирован: 10 июн 2013, 15:05
Откуда: UA

Re: Урок 44. События в ListView

Сообщение anber » 18 июн 2013, 09:31

Вот большая статья на русском: http://habrahabr.ru/post/133575/
Личные сообщения с просьбой ответить на форуме или написать программу я просто удаляю, если я в хорошем настроении. Если в плохом добавляю автора в черный список. По любым другим вопросам feel free to write to me.

Анна Антонова
Сообщения: 7
Зарегистрирован: 16 июн 2013, 16:02

Re: Урок 44. События в ListView

Сообщение Анна Антонова » 19 июн 2013, 20:58

Большое спасибо всем за советы и подсказки! С божьей помощью и какой-то матерью заработало :)

Аватара пользователя
Oplia512
Сообщения: 12
Зарегистрирован: 14 мар 2013, 20:39

Re: Урок 44. События в ListView

Сообщение Oplia512 » 25 июн 2013, 22:13

Всем привет подскажите пожалуйста:
1. В чем ФУНКЦИОНАЛЬНАЯ разница между onItemClickListener и onItemSelectListener что-то не совсем понятно. Исходя из названия ItemSelect для выбора пункта списка но если присвоить его списку и попробывать выбрать что-нибудь он зараза не реагирует.
2. При использовании onItemClickListener можно вытянуть данные из пункта списка (типа он выбран), НО он перестает быть подсвеченым после клика. Я я вставил в обработчик такой метод:

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

lvPersons.setOnItemClickListener(new OnItemClickListener() {
			@Override
			public void onItemClick(AdapterView<?> parent, View view,
					int position, long id) {
				setColorOnItem(view);
				data = db.getData(id); //получает данные из БД в массив по id
			}
		});
	}

	public void setColorOnItem(View v) {
		if (oldview != null)
			oldview.setBackgroundResource(0);
		oldview = v;
		v.setBackgroundColor(Color.LTGRAY);
	}
Это корректно так делать или есть какой стандартный метод для того чтобы оставить выделение цветом выбранного элемента списка?
3. Если приемлемо, то где глянуть стандартный цвет которым выделяется пункт списка при клике?

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 44. События в ListView

Сообщение Foenix » 26 июн 2013, 00:03

Этот вопрос уже много-много раз тут обсуждали.. поищи внимательнее.
А что, твоим способом подсвечивается? интересный подход) Более стандартный - переопредлить метод getview собственного адаптера списка.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
Oplia512
Сообщения: 12
Зарегистрирован: 14 мар 2013, 20:39

Re: Урок 44. События в ListView

Сообщение Oplia512 » 26 июн 2013, 19:16

Foenix писал(а):Этот вопрос уже много-много раз тут обсуждали.. поищи внимательнее.
А что, твоим способом подсвечивается? интересный подход) Более стандартный - переопредлить метод getview собственного адаптера списка.
Ок спасибо, за все ответы. Мой метод подсвечивает последний кликнутый (выбранный) пункт ListView.

Аватара пользователя
Oplia512
Сообщения: 12
Зарегистрирован: 14 мар 2013, 20:39

Re: Урок 44. События в ListView

Сообщение Oplia512 » 16 июл 2013, 22:28

dcbp писал(а):Друзья! Столкнулся с неожиданной трудностью.
Пишу код:

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

@Override
    public void onResume() {

    	setContentView(R.layout.main);
		

		filesList = (ListView) findViewById(R.id.filesList);
			
		filesList.setOnItemClickListener(new OnItemClickListener() {
		      public void onItemClick(AdapterView<?> parent, View view,
		              int position, long id) {
		            Log.d("myLogs", "itemClick: position = " + position + ", id = "
		                + id);
		          }
		        });
		
           String[] from = { "filename", "creationDate" , "id" };
           int[] to = { R.id.tvFileName, R.id.tvDate , R.id.bDelete };
		
		
	    files = new ArrayList<Map<String, Object>>();
	    adapter = new SimpleAdapter(Main.this, files, R.layout.files_item2, from, to);
	    
	    	mfiles = new HashMap<String, Object>();
	    	mfiles.put("filename", "dvsds");
	    	mfiles.put("creationDate", "svdvsdv");
	    	mfiles.put("id", 1);
	    	mfiles.put("file_id", 2);
		files.add(mfiles);
	    
	    filesList.setAdapter(adapter);
	    
		
    	super.onResume();
    }
а он не работает(
Просто никак не реагирует на клик по элементу списка. Порядок строк менял по разному. Что я упускаю?

На всякий случай вот вью элемента

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

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginBottom="5dp"
    android:layout_marginTop="5dp"
    android:background="#ff6600"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/tvDate"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="right"
        android:layout_marginBottom="10dp"
        android:layout_marginRight="5dp"
        android:text="date"
        android:textColor="#000" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1" >

        <TextView
            android:id="@+id/tvFileName"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginBottom="20dp"
            android:layout_marginLeft="10dp"
            android:layout_weight="1"
            android:text="FileName"
            android:textColor="#000"
            android:textSize="18sp" />

        <Button
            android:id="@+id/bDelete"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginRight="10dp"
            android:text="X" />

    </LinearLayout>

</LinearLayout>
Прочитал все и понял, никто не написал где собственно проблема и как ее починить. И решил ответить. Таки вот. Проблема в кнопке! :) И если в элементе списка будет присутствовать любой элемент типа "кнопка" (Button, radiobutton, checkbox и т.д.) будет возникать проблема - список не реагирует на нажатие. Решение простое - на элементе "кнопка" в свойстве focusable поставить false. Все. Мира и процветания Вам, братья по разуму! (с)

Аватара пользователя
Oplia512
Сообщения: 12
Зарегистрирован: 14 мар 2013, 20:39

Re: Урок 44. События в ListView

Сообщение Oplia512 » 16 июл 2013, 22:50

Таки теперя вопрос.
Долго и упорно куря интернет в поисках того как сделать кастомный список чтобы он работал как при использовании android.R.layout.simple_list_item_single_choice т.е. radiobutton подсвечивал выбранный элемент.
вот код стандартного лэйаута

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

<?xml version="1.0" encoding="utf-8"?>
<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:binding="http://www.gueei.com/android-binding/"
    android:id="@android:id/text1"
    android:layout_width="fill_parent"
    android:layout_height="?android:attr/listPreferredItemHeight"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:gravity="center_vertical"
    android:checkMark="?android:attr/listChoiceIndicatorSingle" - секрет тут!
    android:paddingLeft="6dip"
    android:paddingRight="6dip"
    binding:text="."
/>

Но просто вставляя в свойства radiobutton - android:button="?android:attr/listChoiceIndicatorSingle" я ничего не добился.
Покурив еще, нашел много ссылок на то что нужно сделать пункт списка chekable, нашел интересную ссылку на то как сделать лэйаут Chekable, сломал мозк. http://www.marvinlabs.com/2010/10/29/cu ... eck-items/ (кстати неплохая тема для урока :) )

Так вот вопрос к ГУРУ. Как сделать кастомный список с radiobutton так, чтобы он работал как стандартный в плане индикации выбора пункта списка? Спасибо за ответы.

Serge
Сообщения: 5
Зарегистрирован: 24 июн 2013, 16:29

Re: Урок 44. События в ListView

Сообщение Serge » 23 июл 2013, 12:13

После этого урока возник вопрос по эмулятору.
ItemSelect у меня вызывается только при нажатии пробела, при этом позиционируется на строке, где был последний клик. Ни кнопки курсора, ни колесо мыши не работает.
При скролле не всегда, после того, как катнули, вызывается окончание скролла - тоже не уловил логики.
scrollState = 1
scrollState = 2
scrollState = 1
scrollState = 2
scrollState = 1
scrollState = 2
scrollState = 0

У других тоже есть похжие проблемы? У меня Windows 8 - может поэтому.

troublemaker
Сообщения: 6
Зарегистрирован: 28 авг 2013, 19:45

Re: Урок 44. События в ListView

Сообщение troublemaker » 28 авг 2013, 20:59

помогите плз. делал все по уроку. в чем ошибка?
Вложения
помогите плз. делал все по уроку. в чем ошибка?
помогите плз. делал все по уроку. в чем ошибка?
qwerty.jpg (362.59 КБ) 13593 просмотра

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

Re: Урок 44. События в ListView

Сообщение rezak90 » 28 авг 2013, 21:02

пишет что в main.xml на 3-й строке не может найти такой ресурсник, так что смотри там
R.id.team
Политика на форуме запрещена

Ответить