Страница 1 из 1

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

Добавлено: 14 май 2014, 02:06
garrytrue
Народ, есть такая проблема, думаю многие сталкивались, инфа в инертетах есть, но что-то победить не могу((.
В кратце, есть 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 подсвеченный эл-т смещаеться на один вниз(по списку).
Вообщем вот такая вот ерунда. Обьясните на русском языке в какую сторону капать.
Заранее благодарен

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

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

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

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

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

Добавлено: 14 май 2014, 13:36
Foenix
что значит "затем добавляю новую запись в базу"

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

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

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

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

Добавлено: 14 май 2014, 14:04
Foenix
все равно - такое длинное объяснение и ничего не понятно.
Говорите - контекстное меню (хотя оно уже давно устарело), затем добавление записи. А подсвечиваете-то что??

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

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

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

Добавлено: 14 май 2014, 14:43
Foenix
короче. Если вы, при клике на строке правильно делаете то, что я объясняла выше - т.е. заносите эту галочку в соответствующую таблицу в базу данных по айди этой таблицы, то никакие дополнительные манипуляции - добавление, удаление, прокручивание списка - не будут влиять на его окраску, галочки и прочие бантики.

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

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

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

Добавлено: 14 май 2014, 16:09
Foenix
как это "изменить"? выражайся понятнее.

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