ListView как обработать нажатие кноки в строке?

Ответить
grem17
Сообщения: 85
Зарегистрирован: 16 сен 2014, 11:54

ListView как обработать нажатие кноки в строке?

Сообщение grem17 » 01 окт 2014, 07:39

На основном экране имею ListView, которую заполняю данными из SQL базы, используя для соединения SimpleAdapter.
Данные подставляются в заранее подготовленную layout (там 3 поля TextView+кнопка)
В итоге получается ListView заполненная строками, каждая из которых состоит из 3х TextView и кнопки

мне надо по нажатию кнопки обработать соотвествующую TextView из этой же строки...

на одном из форумов нашел вот такой совет
"ListView имеет метод getChildAt. У адаптера есть getView. Получаем View контейнера строки, далее в нем делаем findViewById с id кнопки. Все. "
как его применить на практике не знаю, инфу найти не могу, помогите плз

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

Re: ListView как обработать нажатие кноки в строке?

Сообщение Foenix » 01 окт 2014, 08:24

разберись с кастомным адаптером вначале. На стандартном это сделать нельзя. Уроки тут есть.
R.id.team

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

grem17
Сообщения: 85
Зарегистрирован: 16 сен 2014, 11:54

Re: ListView как обработать нажатие кноки в строке?

Сообщение grem17 » 01 окт 2014, 08:32

кастомный адаптер - имеешь ввиду создать отдельный класс под него и переопределить метод...
onClickListener (вроде так)?

попробую, а не может быть проблема из-за того что перерисовка ListView сделана в отдельной функции, чтобы ее можно было вызывать по требованию из других активностей?

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

public class MainActivity extends Activity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		upd_lv_main();	
	}

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

public void upd_lv_main(){
		final ListView lv = (ListView)findViewById(R.id.lv_main);		
		ArrayList<HashMap<String, Object>> curList = new ArrayList<HashMap<String, Object>>();
		HashMap<String, Object> hm;
		..........				
						
		hm = new HashMap<String, Object>();
		hm.put("t1",t1);
		hm.put("t2",t2);
		hm.put("t3",t3);
		curList.add(hm);
	}

final SimpleAdapter adapter = new SimpleAdapter(this, curList, R.layout.lv_main, new String[] "t1", "t2", "t3"},new int[] { R.id.tv_t1, R.id.tv_t2, R.id.tv_t3});
lv.setAdapter(adapter);									
}

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

Re: ListView как обработать нажатие кноки в строке?

Сообщение Foenix » 01 окт 2014, 09:10

перерисовка ListView сделана в отдельной функции, чтобы ее можно было вызывать по требованию из других активностей?
Про это ВООБЩЕ ЗАБУДЬ. Отдельным методом можно, но не с этими целями. Функции тут отсутствуют.
И это к вопросу не относится.
R.id.team

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

grem17
Сообщения: 85
Зарегистрирован: 16 сен 2014, 11:54

Re: ListView как обработать нажатие кноки в строке?

Сообщение grem17 » 01 окт 2014, 09:27

почему забудь? я это реализовал и это работает, код предоставил выше

почему отсутсвуют функции? а это что такое например?
создаем класс, в нем расшариваем функцию возвращающую значение

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

public String myFunct() {
....
String str="dfdfsdfs";
return str;
}
в другом модуле объявляем класс, вызываем функцию, получаем от нее значение

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

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

public void myFunct() {
....
}

grem17
Сообщения: 85
Зарегистрирован: 16 сен 2014, 11:54

Re: ListView как обработать нажатие кноки в строке?

Сообщение grem17 » 01 окт 2014, 11:07

создал кастомный адаптер

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

	class MySimpleAdapter extends SimpleAdapter {
		public MySimpleAdapter(Context context,
				List<? extends Map<String, ?>> data, int resource,
				String[] from, int[] to) {
			super(context, data, resource, from, to);
		}
		
		@Override
	    public View getView(int position, View convertView, ViewGroup parent) {
			View view = super.getView(position, convertView, parent);
	        return view;		
	    }
	}
как получить getView? вот такая запись не работает, требует position...как узнать его?
Toast.makeText(MainActivity.this, String.valueOf(getView(position, convertView, parent)), Toast.LENGTH_SHORT).show();

grem17
Сообщения: 85
Зарегистрирован: 16 сен 2014, 11:54

Re: ListView как обработать нажатие кноки в строке?

Сообщение grem17 » 01 окт 2014, 11:51

не, не то спрашиваю

вот создал я кастомный адаптер, как узнать на какой позиции в listview сейчас нахожусь?
попробовал сделать вот так

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

@Override
	    public View getView(int position, View convertView, ViewGroup parent) {
			View view = super.getView(position, convertView, parent);
	        Toast.makeText(MainActivity.this, String.valueOf(position), Toast.LENGTH_SHORT).show();
	        return view;
	    }
при запуске сразу начинают выходить сообщения 0,1,2,3,4,5,6 и потом еще раз с начала...это видимо номер строки в цикле прокручиваются, видимо когда идет отрисовка ListView

а как узнать ее номер по клику на ней?

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: ListView как обработать нажатие кноки в строке?

Сообщение Mikhail_dev » 01 окт 2014, 12:00

реализуйте слушатель OnItemClickListener.

myListView.setOnItemClickListener(this);

[syntax=java5]
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//position - номер позиции в списке. View - сама вьюшка, в которой можно найти необходимые элементы и что-то с ними сделать
}
[/syntax]

Это мой код, я реализовал данный слушатель в активности

grem17
Сообщения: 85
Зарегистрирован: 16 сен 2014, 11:54

Re: ListView как обработать нажатие кноки в строке?

Сообщение grem17 » 01 окт 2014, 12:40

Mikhail_dev
я уже пробовал навесить событие на listview, почему то не срабатывает

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

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		ListView lv = (ListView)findViewById(R.id.lv_main);
		lv.setOnItemClickListener(new OnItemClickListener() {
			@Override
			public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
					long arg3) {
				Toast.makeText(MainActivity.this, "ddddddd", Toast.LENGTH_SHORT).show();
			}
		});
		
		//кнопка "добавить", вызывает активность activity_add
		Button btn_add = (Button) findViewById(R.id.btn_add);
		btn_add.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				Intent intent = new Intent(MainActivity.this, AddEdit.class);
				startActivityForResult(intent, REQUEST_ADDEDIT);
			}
		});
			
		//отрисовать на основном экране таблицу    
		upd_lv_main();	
	}

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

public void upd_lv_main(){
	//отображаем данные в listView из таблицы SQL
		//curList = new ArrayList<HashMap<String, Object>>();
			final ListView lv = (ListView)findViewById(R.id.lv_main);	
			
					ArrayList<HashMap<String, Object>> curList = new ArrayList<HashMap<String, Object>>();
					HashMap<String, Object> hm;
					
					SQLWorkDB SQLWorkDB = new SQLWorkDB(MainActivity.this);
					Cursor cursor = SQLWorkDB.GetCursor();
					
					while (cursor.moveToNext()){
						int id = cursor.getInt(cursor.getColumnIndex(SQLWorkDB.c_tMain_ID));
						cc = cursor.getString(cursor.getColumnIndex(SQLWorkDB.c_tMain_cc));
						ss = cursor.getString(cursor.getColumnIndex(SQLWorkDB.c_tMain_ss));
						mm = cursor.getString(cursor.getColumnIndex(SQLWorkDB.c_tMain_mm));
						
						hm = new HashMap<String, Object>();
						hm.put("cc",cc); // Название
						hm.put("ss",ss); // Описание
						hm.put("mm",mm); // Описание
						curList.add(hm);
					}
			
					// создаем адаптер
				    MySimpleAdapter sAdapter = new MySimpleAdapter(this, curList, R.layout.lv_main, new String[] {"cc", "ss", "mm"},
							new int[] { R.id.tv_lv_main_cc, R.id.tv_lv_main_ss, R.id.tv_lv_main_mm});
			    
				    // определяем список и присваиваем ему адаптер
				    lv.setAdapter(sAdapter);		    				    
	}

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

	class MySimpleAdapter extends SimpleAdapter {

		public MySimpleAdapter(Context context,
				List<? extends Map<String, ?>> data, int resource,
				String[] from, int[] to) {
			super(context, data, resource, from, to);

		}
		
		@Override
	    public View getView(int position, View convertView, ViewGroup parent) {
			View view = super.getView(position, convertView, parent);
	        return view;
	    }
	}

grem17
Сообщения: 85
Зарегистрирован: 16 сен 2014, 11:54

Re: ListView как обработать нажатие кноки в строке?

Сообщение grem17 » 02 окт 2014, 09:47

когда делаю заполнение через SimpleAdapter то строки в ListView не нажимаются и соотвественно не срабатывает onClick на них...
если сделать через ArrayAdapter - то все работает нормально

но мне надо через SimpleAdapter

grem17
Сообщения: 85
Зарегистрирован: 16 сен 2014, 11:54

Re: ListView как обработать нажатие кноки в строке?

Сообщение grem17 » 02 окт 2014, 10:49

фух, решение найдено на зарубежном форуме
итак если при заполнении ListView через SimplAdapter у вас не наживамются строки и не срабатывает событие setOnItemClickListener, то...

добавить строчку android:descendantFocusability="blocksDescendants" в макет layout файла который служит шаблоном для заполнения основной ListView

вот где нашел ответ
http://stackoverflow.com/questions/1893 ... g#18933271

grem17
Сообщения: 85
Зарегистрирован: 16 сен 2014, 11:54

Re: ListView как обработать нажатие кноки в строке?

Сообщение grem17 » 02 окт 2014, 12:33

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

в кастомном адаптере переписываем метод getView, таким образом что каждой кнопке присваивается номер строки

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

		@Override 
		public View getView(int position, View convertView, ViewGroup parent) {
			View view = super.getView(position, convertView, parent);
			Button btn = (Button) view.findViewById(R.id.btn_lv_main_play);
			 btn.setTag(position);
			return view; 
			 }
в layout шаблона которым заполняем ListView, для кнопки определяем событие
android:onClick="onClickPlayInMain"

в основной активити прописываем реакцию на это событие, сначала из кнопки получаем номер строки в которой она присутсвтует, потом находим в этой строке нужные элемент и работаем с ним

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

	public void onClickPlayInMain (View v){	
		int positionString=(Integer) v.getTag();
		ListView lv = (ListView)findViewById(R.id.lv_main);
		TextView ed = (TextView)lv.getChildAt(positionString).findViewById(R.id.tv_lv_main_Contact);
		ed.setText("ddddddd");
		Toast.makeText(this,String.valueOf(v.getTag()), Toast.LENGTH_SHORT).show();
	}

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

Re: ListView как обработать нажатие кноки в строке?

Сообщение Foenix » 02 окт 2014, 13:16

такую ерунду на заграничных форумах? ну разве что ради тренировки английского.
Поищи по нашему форуму, сколько раз упоминалось хотя бы blocksDescendants, а так же обрати внимание - в какой теме.. а в этом теме уже нажатие кнопки, думаю, обсуждалось много раз.
R.id.team

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

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

Re: ListView как обработать нажатие кноки в строке?

Сообщение KamiSempai » 02 окт 2014, 14:49

Foenix писал(а):такую ерунду на заграничных форумах? ну разве что ради тренировки английского.
Поищи по нашему форуму, сколько раз упоминалось хотя бы blocksDescendants, а так же обрати внимание - в какой теме.. а в этом теме уже нажатие кнопки, думаю, обсуждалось много раз.
Вот, например, я пример адаптера выкладывал viewtopic.php?f=3&t=251&start=200#p33025
Там CursorAdapter используется, но на примере этого адаптера можно сделать и на любом другом адаптере.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

grem17
Сообщения: 85
Зарегистрирован: 16 сен 2014, 11:54

Re: ListView как обработать нажатие кноки в строке?

Сообщение grem17 » 02 окт 2014, 19:13

мне как новичку пока сложно искать инфу и разбираться с нуля, поэтому любая проблема превращается в глобальную =)

grem17
Сообщения: 85
Зарегистрирован: 16 сен 2014, 11:54

Re: ListView как обработать нажатие кноки в строке?

Сообщение grem17 » 02 окт 2014, 19:21

Foenix писал(а):сколько раз упоминалось хотя бы blocksDescendants
когда возникает проблема то не знаешь ведь что именно и где искать

Ответить