ListView: обновление данных через EditText

Интерфейс, диалоги, темы, стили, меню
Ответить
Idol
Сообщения: 55
Зарегистрирован: 26 июн 2013, 04:33

ListView: обновление данных через EditText

Сообщение Idol » 05 авг 2013, 05:16

Кто-нибудь сталкивался с реализацией обновления данных через EditText построчно?
К примеру, вешать OnFocusChangeListener на EditText. Как только фокус поменялся, обновить данные предыдущей строки.
Я использую кастомный CursorAdapter.
Поиск в сети нормальных примеров не дал.
Это вообще возможно?

Аватара пользователя
Finch
Сообщения: 439
Зарегистрирован: 16 июл 2012, 21:37

Re: ListView: обновление данных через EditText

Сообщение Finch » 05 авг 2013, 08:36

Не проще ли реализовать метод(void) в котором на входе будет Стринг и Инт, в конце вызвать notifyDataSetChanged(), инт - это номер айтема листвью в котором нужно обновить текст, ну и стринг - это сам текст???
CEO of a company R.id.team

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

Re: ListView: обновление данных через EditText

Сообщение KamiSempai » 05 авг 2013, 12:36

Idol писал(а):Это вообще возможно?
Это возможно но не нужно.
Когда-то тоже пытался сделать подобное, но потом понял, что вызывать диалог по клику на строке более правильное решение.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

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

Re: ListView: обновление данных через EditText

Сообщение Foenix » 05 авг 2013, 12:54

Idol писал(а):Кто-нибудь сталкивался с реализацией обновления данных через EditText построчно?
К примеру, вешать OnFocusChangeListener на EditText. Как только фокус поменялся, обновить данные предыдущей строки.
Я использую кастомный CursorAdapter.
Поиск в сети нормальных примеров не дал.
Это вообще возможно?
возможно, но UI должен быть очевидным для пользователя, а это будет сильно большой сюрприз для него, если допустим он что-то внес туда просто так, попробовать.
KamiSempai писал(а):
Idol писал(а):Это вообще возможно?
Это возможно но не нужно.
Когда-то тоже пытался сделать подобное, но потом понял, что вызывать диалог по клику на строке более правильное решение.
Добавление данных по клику на строке?? :o
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: обновление данных через EditText

Сообщение KamiSempai » 05 авг 2013, 13:19

Foenix писал(а):Добавление данных по клику на строке?? :o
Разве вопрос был про добавление? Я имел ввиду корректировку.

PS: Кстати, добавление данных по клику на строке очень даже удобное решение, если эта строка футер)
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

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

Re: ListView: обновление данных через EditText

Сообщение Foenix » 05 авг 2013, 13:47

а, точно, понятно.
Покажи какой-нибудь скрин с футером, по которому добавляют.
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: обновление данных через EditText

Сообщение KamiSempai » 05 авг 2013, 14:26

Foenix писал(а):Покажи какой-нибудь скрин с футером, по которому добавляют.
Dolphin Browser 2 скрин.
Opera Mobile Classic 1 скрин.
Вот еще одна неплохая программа :) Training Note 2 скрин.

Так-же можно и хедер использовать.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

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

Re: ListView: обновление данных через EditText

Сообщение Foenix » 05 авг 2013, 14:57

Кроме как у тебя (похожа на обычную кнопку) не увидела добавлений на футере.
У дельфина - это плюсик В РЯДУ картинок.
У оперы тоже просто кнопка..
ну кнопки внизу и собственную панельку кнопок внизу или вверху - многие делают. Я думала, там что-то более интересное придумано.
R.id.team

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

Idol
Сообщения: 55
Зарегистрирован: 26 июн 2013, 04:33

Re: ListView: обновление данных через EditText

Сообщение Idol » 06 авг 2013, 00:44

KamiSempai писал(а):
Idol писал(а):Это вообще возможно?
Это возможно но не нужно.
Когда-то тоже пытался сделать подобное, но потом понял, что вызывать диалог по клику на строке более правильное решение.
Суть не только в нужно-не нужно, а скорее возможно-не возможно. Меня пока интересует больше техническая сторона дела.
Раз вы делали подобное, надеюсь вам не составит труда найти, где я сделал не так.
row xml:

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

<?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:orientation="horizontal">

    <TextView
        android:id="@+id/textName"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_gravity="left|center_vertical"
        android:layout_marginLeft="5dip"
        android:layout_weight="10"
        android:ellipsize="end"
        android:gravity="left|center_vertical"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <EditText
        android:id="@+id/set_group_loop_title"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="2.5"
        android:ems="10"
        android:gravity="center"
        android:inputType="number"
        android:textAppearance="?android:attr/textAppearanceLarge" >

 
    </EditText>

    <TextView
        android:id="@+id/textTime"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_gravity="right|center_vertical"
        android:layout_marginRight="5dip"
        android:layout_weight="5"
        android:gravity="right|center_vertical"
        android:textAppearance="?android:attr/textAppearanceLarge" />

</LinearLayout>
код из адаптера (тут я уже наворочил чуток лишнего, пробовал разные варианты):

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

	public void bindView(View paramView, final Context paramContext, final Cursor paramCursor) {
		final TextView list_item_name = (TextView)paramView.findViewById(R.id.textName);
		list_item_name.setText(paramCursor.getString(paramCursor.getColumnIndex(setColumns.SET_NAME)));
		
		final EditText list_item_loop = (EditText)paramView.findViewById(R.id.set_group_loop_title);
		list_item_loop.setText(paramCursor.getString(paramCursor.getColumnIndex(drillsetColumns.DRILLSET_LOOP_N)));
		
//		list_item_loop.addTextChangedListener(new TextWatcher() {
//			 
//	          public void afterTextChanged(Editable s) {
//	        	  String strValue = list_item_loop.getText().toString();
//	        	  String strValue2 = list_item_name.getText().toString();
//					Log.d(TAG, "EDIT after: User set EditText value to " + strValue + " - " + strValue2);
//
//	          }
//
//	          public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
//
//	          public void onTextChanged(CharSequence s, int start, int before, int count) {
////	        	  String strValue = list_item_loop.getText().toString();
////	        	  Log.d(TAG, "EDIT on: User set EditText value to " + strValue + " - " + list_item_name);
//	          }
//	       });
		
		final String old_loopN = paramCursor.getString(paramCursor.getColumnIndex(drillsetColumns.DRILLSET_LOOP_N));
		final int current_id = Integer.valueOf(paramCursor.getString(paramCursor.getColumnIndex(drillsetColumns._ID)));
		Log.d(TAG, "old_loopN - " + old_loopN+ " - " + current_id);

		list_item_loop.setOnFocusChangeListener(new OnFocusChangeListener() {
			public void onFocusChange(View v, boolean hasFocus) {
				if (!hasFocus) {
					String strValue = list_item_loop.getText().toString();
					String strValue2 = list_item_name.getText().toString();
					Log.d(TAG, "FOCUS: User set EditText value to " + strValue + " - " + strValue2);
					
			        LinearLayout parent = (LinearLayout) v.getParent();
			        EditText qtyTemp = (EditText) parent.findViewById(R.id.set_group_loop_title);
			        String strValue11 = qtyTemp.getText().toString();
			        String strValue13 = Integer.toString(qtyTemp.getId());
					Log.d(TAG, "FOCUS2: User set EditText value to " + strValue11 + " - " + strValue13);

					
					int id = Integer.valueOf(paramCursor.getString(paramCursor.getColumnIndex(drillsetColumns._ID)));

					if (old_loopN != strValue) {
						Log.d(TAG, "UPDATED: " + strValue + " - " + id);
						ContentValues localContentValues = new ContentValues();
						localContentValues.put(drillsetColumns.DRILLSET_LOOP_N, strValue);
						Uri drillUri = ContentUris.withAppendedId(drillsetColumns.CONTENT_URI, id);
						paramContext.getContentResolver().update(drillUri, localContentValues, null, null);
					}
				}
			}
		});
Проблемы: 1) без обновления данных фокус удается удержать в нужном поле, но когда идет обновление, есстественно фокус начинает прыгать и опять пытаться обновлять не то что нужно.

2) Кроме того id элемента выбирается не правильно. Не могу понять почему.
Пример, список открылся и потом щелчек по второму элементу (id=55):

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

:30:27.245:  old_loopN - 3 - 56
:30:27.265:  old_loopN - 2 - 55
:30:27.295:  old_loopN - 2 - 58
:30:27.315:  old_loopN - 2 - 57
:30:27.337:  old_loopN - 3 - 53
:30:27.355:  old_loopN - 3 - 54
:31:07.356:  FOCUS: User set EditText value to 2 - test 1
:31:07.356:  FOCUS2: User set EditText value to 2 - 2131296271
:31:07.356:  UPDATED: 2 - 54
:31:07.516:  drillset_id: 54
:31:07.656:  FOCUS: User set EditText value to 2 - test 1
:31:07.656:  FOCUS2: User set EditText value to 2 - 2131296271
:31:07.656:  UPDATED: 2 - 56
:31:08.106:  drillset_id: 56
:31:08.156:  old_loopN - 3 - 56
:31:08.166:  old_loopN - 2 - 55
:31:08.176:  old_loopN - 2 - 58
:31:08.196:  old_loopN - 2 - 57
:31:08.216:  old_loopN - 3 - 53
:31:08.286:  old_loopN - 2 - 54
:31:08.536:  old_loopN - 2 - 56
:31:08.557:  old_loopN - 2 - 55
:31:08.606:  old_loopN - 2 - 58
:31:08.676:  old_loopN - 2 - 57
:31:08.706:  old_loopN - 3 - 53
:31:08.706:  old_loopN - 2 - 54

Idol
Сообщения: 55
Зарегистрирован: 26 июн 2013, 04:33

Re: ListView: обновление данных через EditText

Сообщение Idol » 06 авг 2013, 01:23

Foenix писал(а):возможно, но UI должен быть очевидным для пользователя, а это будет сильно большой сюрприз для него, если допустим он что-то внес туда просто так, попробовать.
Ну когда наверху написано "Edit Name" и существует лишь одно поле для редактирования. Я думаю, что даже ёжику будет понятно для чего это :).
В моем случае, двухсмысленности нет. Да и с технической стороны это правильнее, когда данные одной таблицы правяться в одной активити, а данные другой в другой активити. Проще потом что-либо менять.
Я в любом случае буду делать редактирование set через диалог по длинному клику.

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

Re: ListView: обновление данных через EditText

Сообщение Foenix » 06 авг 2013, 01:50

id выбирается неправильно возможно потому, что перед тем, как это id доставать нужно сделать курсору Cursor.moveToPosition(position);
потому что пока вы по listview кликаете, позиция текущей записи на курсоре может быть где угодно..
R.id.team

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

Idol
Сообщения: 55
Зарегистрирован: 26 июн 2013, 04:33

Re: ListView: обновление данных через EditText

Сообщение Idol » 07 авг 2013, 01:09

Foenix писал(а):id выбирается неправильно возможно потому, что перед тем, как это id доставать нужно сделать курсору Cursor.moveToPosition(position);
потому что пока вы по listview кликаете, позиция текущей записи на курсоре может быть где угодно..
Тут я не до конца понимаю, как я должен получить позицию курсора (position)?

Idol
Сообщения: 55
Зарегистрирован: 26 июн 2013, 04:33

Re: ListView: обновление данных через EditText

Сообщение Idol » 07 авг 2013, 01:21

Как насчет этого объяснения?
public abstract void bindView (View view, Context context, Cursor cursor)
Added in API level 1
Bind an existing view to the data pointed to by cursor

Parameters
view Existing view, returned earlier by newView
context Interface to application's global information
cursor The cursor from which to get the data. The cursor is already moved to the correct position.
Или вы считаете, что это не работает когда вызывается onFocusChange?

Idol
Сообщения: 55
Зарегистрирован: 26 июн 2013, 04:33

Re: ListView: обновление данных через EditText

Сообщение Idol » 08 авг 2013, 01:38

Похоже данное направление тупиковое, но не из-за интерфейсных изысков, а из-за бага в Андроид.

Невозможно одновременно иметь EditText в элементе списка и повесить клик на оставшуюся часть элемента.
И похоже Гугл и не собирается это фиксить, потому что - This is working as intended to support trackball/dpad navigation.
На мой взгляд полная чушь и отвратительное проектирование.

Ответить