Страница 1 из 1
ListView: обновление данных через EditText
Добавлено: 05 авг 2013, 05:16
Idol
Кто-нибудь сталкивался с реализацией обновления данных через EditText построчно?
К примеру, вешать OnFocusChangeListener на EditText. Как только фокус поменялся, обновить данные предыдущей строки.
Я использую кастомный CursorAdapter.
Поиск в сети нормальных примеров не дал.
Это вообще возможно?
Re: ListView: обновление данных через EditText
Добавлено: 05 авг 2013, 08:36
Finch
Не проще ли реализовать метод(void) в котором на входе будет Стринг и Инт, в конце вызвать notifyDataSetChanged(), инт - это номер айтема листвью в котором нужно обновить текст, ну и стринг - это сам текст???
Re: ListView: обновление данных через EditText
Добавлено: 05 авг 2013, 12:36
KamiSempai
Idol писал(а):Это вообще возможно?
Это возможно но не нужно.
Когда-то тоже пытался сделать подобное, но потом понял, что вызывать диалог по клику на строке более правильное решение.
Re: ListView: обновление данных через EditText
Добавлено: 05 авг 2013, 12:54
Foenix
Idol писал(а):Кто-нибудь сталкивался с реализацией обновления данных через EditText построчно?
К примеру, вешать OnFocusChangeListener на EditText. Как только фокус поменялся, обновить данные предыдущей строки.
Я использую кастомный CursorAdapter.
Поиск в сети нормальных примеров не дал.
Это вообще возможно?
возможно, но UI должен быть очевидным для пользователя, а это будет сильно большой сюрприз для него, если допустим он что-то внес туда просто так, попробовать.
KamiSempai писал(а):Idol писал(а):Это вообще возможно?
Это возможно но не нужно.
Когда-то тоже пытался сделать подобное, но потом понял, что вызывать диалог по клику на строке более правильное решение.
Добавление данных по клику на строке??

Re: ListView: обновление данных через EditText
Добавлено: 05 авг 2013, 13:19
KamiSempai
Foenix писал(а):Добавление данных по клику на строке??

Разве вопрос был про добавление? Я имел ввиду корректировку.
PS: Кстати, добавление данных по клику на строке очень даже удобное решение, если эта строка футер)
Re: ListView: обновление данных через EditText
Добавлено: 05 авг 2013, 13:47
Foenix
а, точно, понятно.
Покажи какой-нибудь скрин с футером, по которому добавляют.
Re: ListView: обновление данных через EditText
Добавлено: 05 авг 2013, 14:26
KamiSempai
Foenix писал(а):Покажи какой-нибудь скрин с футером, по которому добавляют.
Dolphin Browser 2 скрин.
Opera Mobile Classic 1 скрин.
Вот еще одна неплохая программа
Training Note 2 скрин.
Так-же можно и хедер использовать.
Re: ListView: обновление данных через EditText
Добавлено: 05 авг 2013, 14:57
Foenix
Кроме как у тебя (похожа на обычную кнопку) не увидела добавлений на футере.
У дельфина - это плюсик В РЯДУ картинок.
У оперы тоже просто кнопка..
ну кнопки внизу и собственную панельку кнопок внизу или вверху - многие делают. Я думала, там что-то более интересное придумано.
Re: ListView: обновление данных через EditText
Добавлено: 06 авг 2013, 00:44
Idol
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
Re: ListView: обновление данных через EditText
Добавлено: 06 авг 2013, 01:23
Idol
Foenix писал(а):возможно, но UI должен быть очевидным для пользователя, а это будет сильно большой сюрприз для него, если допустим он что-то внес туда просто так, попробовать.
Ну когда наверху написано "Edit Name" и существует лишь одно поле для редактирования. Я думаю, что даже ёжику будет понятно для чего это

.
В моем случае, двухсмысленности нет. Да и с технической стороны это правильнее, когда данные одной таблицы правяться в одной активити, а данные другой в другой активити. Проще потом что-либо менять.
Я в любом случае буду делать редактирование set через диалог по длинному клику.
Re: ListView: обновление данных через EditText
Добавлено: 06 авг 2013, 01:50
Foenix
id выбирается неправильно возможно потому, что перед тем, как это id доставать нужно сделать курсору Cursor.moveToPosition(position);
потому что пока вы по listview кликаете, позиция текущей записи на курсоре может быть где угодно..
Re: ListView: обновление данных через EditText
Добавлено: 07 авг 2013, 01:09
Idol
Foenix писал(а):id выбирается неправильно возможно потому, что перед тем, как это id доставать нужно сделать курсору Cursor.moveToPosition(position);
потому что пока вы по listview кликаете, позиция текущей записи на курсоре может быть где угодно..
Тут я не до конца понимаю, как я должен получить позицию курсора (position)?
Re: ListView: обновление данных через EditText
Добавлено: 07 авг 2013, 01:21
Idol
Как насчет этого объяснения?
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?
Re: ListView: обновление данных через EditText
Добавлено: 08 авг 2013, 01:38
Idol
Похоже данное направление тупиковое, но не из-за интерфейсных изысков, а из-за
бага в Андроид.
Невозможно одновременно иметь EditText в элементе списка и повесить клик на оставшуюся часть элемента.
И похоже Гугл и не собирается это фиксить, потому что - This is working as intended to support trackball/dpad navigation.
На мой взгляд полная чушь и отвратительное проектирование.