OnClick в динамическом CursorAdapter

Ответить
garrytrue
Сообщения: 7
Зарегистрирован: 01 апр 2014, 23:09

OnClick в динамическом CursorAdapter

Сообщение garrytrue » 14 май 2014, 02:06

Народ, есть такая проблема, думаю многие сталкивались, инфа в инертетах есть, но что-то победить не могу((.
В кратце, есть ListView в который из локальной базы через CursorAdapter поступает инфа(имя продукта).
Layut-файл для одного рядка

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

<?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="match_parent" >

    <TextView
        android:id="@+id/itemName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="69dp"
        android:layout_marginTop="21dp"
        android:textSize="@dimen/collapsedTitle" />

    <CheckBox
        android:id="@+id/itemStatus"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/itemName"
        android:layout_alignBottom="@+id/itemName"
        android:layout_alignParentRight="true"
        android:layout_marginRight="43dp"
        android:focusable="false"
        android:focusableInTouchMode="false" />

</RelativeLayout>
Далее самое интересное. При нажатии на эл-т списка в этом эл-те должен выбраться CheckBox и например TextView изменить цвет(вообще-то в onClick() я читаю _id эл-та таблицы и занощу его в arraylist и дальше перекидываю по приложению, но это сейас не важно).
Вот код моего CursorAdapter

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

public class ItemAdapter extends CursorAdapter{

	private LayoutInflater mLayoutInflater;
	private static final String TAG = "ItemAdapter.class";
	private int position;

	public ItemAdapter(Context context, Cursor c, int flags) {
		super(context, c, flags);
		// TODO Auto-generated constructor stub
		mLayoutInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
	}

	@Override
	public void bindView(View view, Context context, Cursor cursor) {
		// TODO Auto-generated method stub
		Log.i(TAG, "Invoke bindView()");
		ViewHolder mbindViewHolder = (ViewHolder) view.getTag();

		mbindViewHolder.currentTextView.setText(
				cursor.getString(cursor.getColumnIndex(PurchaseDataBase.ITEM_NAME)));
		mbindViewHolder.currentTextView.setOnClickListener(new MyTextViewListener(mbindViewHolder.currentTextView,
				cursor.getPosition()));





	}

	@Override
	public View newView(Context context, Cursor cursor, ViewGroup parent) {
		Log.i(TAG, "Invoke newView()");
		// TODO Auto-generated method stub
		ViewHolder mViewHolder = new ViewHolder();
		View currentView = mLayoutInflater.inflate(R.layout.item_layout,parent,false);
		mViewHolder.currentTextView = (TextView) currentView.findViewById(R.id.itemName);
		mViewHolder.currentCheckBox = (CheckBox) currentView.findViewById(R.id.itemStatus);
		position = cursor.getPosition();
		Log.i(TAG, "Cursor position in newView() "+String.valueOf(position));
		mViewHolder.currentTextView.setTag(position);


		/*currentView.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Log.i(TAG, "onClick in newView");
				Log.i(TAG, "Cursor position in newView is: "+ String.valueOf(mViewHolder.position));				
			}
		});*/

		currentView.setTag(mViewHolder);
		return currentView;
	}

	static class ViewHolder{
		protected TextView currentTextView;
		protected CheckBox currentCheckBox;
	}

	class MyTextViewListener implements View.OnClickListener {
		View mview;
		int position;


		public MyTextViewListener(View v, int position) {
			// TODO Auto-generated constructor stub

			this.mview = v;
			this.position = position;
		}

		@Override
		public void onClick(View v) {
			// TODO Auto-generated method stub
			v.setBackgroundColor(Color.CYAN);

		}
	}

}
И вроде бы все хорошо и все работает все подсвечиваеться, только пока не начинаешь список листать и пока не вступает в работу так называемый механизм recycleView. Нажимал на одном, пролистал увидел другие эл-ты тоже подсветило, вернулся назад(к началу списка), там подсвечен совершенно другой эл-т (не тот на который нажимал).
При добавление эл-та в базу(через LoaderManager.LоaderCallback<Cursor>) в ListView подсвеченный эл-т смещаеться на один вниз(по списку).
Вообщем вот такая вот ерунда. Обьясните на русском языке в какую сторону капать.
Заранее благодарен

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

Re: OnClick в динамическом CursorAdapter

Сообщение Foenix » 14 май 2014, 11:41

если ваш список построен на курсоре, то это неизменяемый объект. Т.е. туда нельзя внести никакие изменения (а они необходимы, т.к. состояние чекбокса должно браться из курсора!).
Выхода тут два (если нужен чекбокс).
1) построить список на массиве данных (коллекции)
2) внести в таблицу поле, например, integer и при клике на строку записывать данные туда. При этом желательно организовать лоадер меденжер и контент провайдер, и все будет автоматически далее происходить. Без этого - нужно при каждом клике перевыбирать, передергивать запрос в курсор заново.
R.id.team

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

garrytrue
Сообщения: 7
Зарегистрирован: 01 апр 2014, 23:09

Re: OnClick в динамическом CursorAdapter

Сообщение garrytrue » 14 май 2014, 12:08

Foenix писал(а):если ваш список построен на курсоре, то это неизменяемый объект. Т.е. туда нельзя внести никакие изменения (а они необходимы, т.к. состояние чекбокса должно браться из курсора!).
Выхода тут два (если нужен чекбокс).
1) построить список на массиве данных (коллекции)
2) внести в таблицу поле, например, integer и при клике на строку записывать данные туда. При этом желательно организовать лоадер меденжер и контент провайдер, и все будет автоматически далее происходить. Без этого - нужно при каждом клике перевыбирать, передергивать запрос в курсор заново.
Насчет динамического действительно возможно ошибся. CheckBox служит исключительно для визуального отображения нажатия на эл-т списка(типо Выбрано!! Гуд!!)
Просто проблема кроется в другом. Давайте сделаем проще.
Например я подсвечиваю TextView нажатием (setBackgroundColor()), затем добавляю новую запись в базу, loadermanager мне "передергивает" cursor(запрос на отображение всех эл-тов таблицы) и у меня подсвечивается(после добавления нового эл-та) не тот эл-т на которой кликнул изначально, а следующий за ним.
Также для наглядности заносил id кликнутого эл-та в ArrayList, все заносилось корректно, но при добавление нового эл-та подсветка смещалась, а в arrayList- у как и следовало ожидать оставалась позиция изначально кликнутого эл-та.
И соответственно когда листаю список подсвеченный эл-ты перемещаются в рандомном порядке

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

Re: OnClick в динамическом CursorAdapter

Сообщение Foenix » 14 май 2014, 13:36

что значит "затем добавляю новую запись в базу"

Визуально ты хочешь выделить элемент, или не визуально - это в данном случае все равно, делать нужно тем путем, что я объяснила, по-другому не получится.
R.id.team

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

garrytrue
Сообщения: 7
Зарегистрирован: 01 апр 2014, 23:09

Re: OnClick в динамическом CursorAdapter

Сообщение garrytrue » 14 май 2014, 13:58

что значит "затем добавляю новую запись в базу"
Под рукой кода нет )) На работе сейчас. Но в общем из контекстного меню приложения вызываю Dialog, в котором есть EditText View и две кнопки (Cancel и Ok) из editText читаю введенный текст затем через ContetnValues добавляю запись в базу(таблицу) и затем loadermanager.forceload возвращает мне курсор с новыми данными и вот теперь после всего этого у меня меняется (подсвечивается) не то view на которое кликнул, а следующие за ним ((( Вот такая вот печаль

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

Re: OnClick в динамическом CursorAdapter

Сообщение Foenix » 14 май 2014, 14:04

все равно - такое длинное объяснение и ничего не понятно.
Говорите - контекстное меню (хотя оно уже давно устарело), затем добавление записи. А подсвечиваете-то что??
R.id.team

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

garrytrue
Сообщения: 7
Зарегистрирован: 01 апр 2014, 23:09

Re: OnClick в динамическом CursorAdapter

Сообщение garrytrue » 14 май 2014, 14:33

все равно - такое длинное объяснение и ничего не понятно.
C какого момента не понятно.
Подсвечиваю= изменяю фон view (view.setBackgroudColor(int Color))

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

Re: OnClick в динамическом CursorAdapter

Сообщение Foenix » 14 май 2014, 14:43

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

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

garrytrue
Сообщения: 7
Зарегистрирован: 01 апр 2014, 23:09

Re: OnClick в динамическом CursorAdapter

Сообщение garrytrue » 14 май 2014, 14:57

Foenix писал(а):короче. Если вы, при клике на строке правильно делаете то, что я объясняла выше - т.е. заносите эту галочку в соответствующую таблицу в базу данных по айди этой таблицы, то никакие дополнительные манипуляции - добавление, удаление, прокручивание списка - не будут влиять на его окраску, галочки и прочие бантики.
А если я его хочу еще изменить его(всмысле эл-та) внешний вид. Т.е при обновлении курсора у мня обновиться только инфа которая есть в таблице. Но не отличный от общего внешний вид(бантики )) )

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

Re: OnClick в динамическом CursorAdapter

Сообщение Foenix » 14 май 2014, 16:09

как это "изменить"? выражайся понятнее.

какая разница тогда что менять - отдельный лэйаут или какой-то "невидимый"
R.id.team

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

Ответить