Урок 52. SimpleCursorAdapter, пример использования

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

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение Foenix » 18 июн 2013, 12:57

Конечно можно - в любом удобном виде. Я использую и long и в виде строки с датой (где нужно только на экран выводить\вводить). Только нужно учитывать то, что если нужно будет делать запросы, сортировки по дате - то удобнее long.
Можно еще в формате YYYYMMDD хранить..
Можно два поля хранить даже.
R.id.team

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

Pavel A
Сообщения: 7
Зарегистрирован: 21 июн 2013, 15:16

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение Pavel A » 21 июн 2013, 15:33

подскажите пожалуйста . Есть база данных :

1 Петя
2 Вася
3 Егор

нужно вывести эту базу в диалоговый список выбора на экране (как в уроке 63) , добавив два поля в сам список , в начале и в конце , вот так :

<Отсутствует>
Петя
Вася
Егор
<Добавить>

самому мне , кроме как копирование курсора в массив , добавление к массиву необходимых строк и вывода в список, уже не из SimpleCursorAdapter , а из ArrayAdapter , ничего в голову не приходит . Может есть более разумное решение ?

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

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение KamiSempai » 21 июн 2013, 15:41

Читайте дальше. В 55 уроке об этом будет написано.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Pavel A
Сообщения: 7
Зарегистрирован: 21 июн 2013, 15:16

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение Pavel A » 21 июн 2013, 16:11

Спасибо ,что откликнулись , к сожалению я уже прочитал урок 55 и понял из него только то , что метод AddHeaderView (или что то подобное) отсутствует в onCreateDialog или я не знаю , как его применить ..

возможно я не совсем правильно задал вопрос , есть таблицы в базе данных со списками значений , нужно , в зависимости от ситуации выводить диалоговые окна с этими списками (для каждой ситуации - свой ) , к каждому списку добавить : сверху <Отсутствует> - выход из диалогового окна без изменений и снизу <Добавить> - добавить в выводимую в данное время таблицу новый элемент . Клик на элементах просто возвращает их id в таблице .

сейчас ( без элементов <отутствует-добавить> у меня это диалоговое окно выводиться таким образом , для одной таблицы table1)

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

protected Dialog onCreateDialog(int id) {
      switch (id) {
        case 0:cursor_dialog = database.query("table1",null, null, null, null, null, null);break;
      }
        AlertDialog.Builder  adb = new AlertDialog.Builder(this);
        adb.setCursor(cursor_dialog, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                idChoiceDialog = cursor_dialog.getInt(0);
                updateDisplay();

            }
        },"name");

        return adb.create();
не хотелось бы все переписывать по другому

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

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение KamiSempai » 21 июн 2013, 17:19

Я тут заглянул по капот к классу AlertDialog.
Похоже, что при вызове метода create() у класса AlertDialog.Builder, адаптер сразу в список не устанавливается. Делается это только при показе диалога.
То-есть, можно поступить так:
[syntax=java]//... Создание билдера ...

// Затем создаем диалог но не возвращаем его.
AlertDialog dialor = adb.create();
ListView list = dialor.getListView();
// Ставим свои футеры и хедеры для списка list ...

return dialor;[/syntax]

Кстати, если это действительно работает, не плохо бы об этом упомянуть в уроках про AlertDialog.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Pavel A
Сообщения: 7
Зарегистрирован: 21 июн 2013, 15:16

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение Pavel A » 21 июн 2013, 18:38

KamiSempai писал(а): ... Кстати, если это действительно работает ...
кстати , это действительно работает !!!

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

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

protected Dialog onCreateDialog(int id) {
        numberDialog = id;
      switch (id) {
        case 0:cursor_dialog = database.query("table1",null, null, null, null, null, null);break;
      }

        AlertDialog.Builder  adb = new AlertDialog.Builder(this);

       adb.setCursor(cursor_dialog, new DialogInterface.OnClickListener() {
           public void onClick(DialogInterface dialog, int which) {
               idChoiceDialog = cursor_dialog.getInt(0);
               updateDisplay();
           }
       }, "name");
        AlertDialog d = adb.create();
        ListView list = d.getListView();
        View v = getLayoutInflater().inflate(android.R.layout.simple_list_item_1, null);
        ((TextView)v.findViewById(android.R.id.text1)).setText("Отсутствует");
        list.addHeaderView(v);
      return d;
    }
все в лучшем виде получилось ,немного форматирование элемента не подходит (отступ текста от левого края) , но эту ерунду быстро поправим - какой там layout AlertDialog для списков использует .. благодарствую за подсказку !

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

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение KamiSempai » 21 июн 2013, 19:36

Pavel A писал(а):...какой там layout AlertDialog для списков использует ...
На сколько я понимаю, это вопрос?
Если да, то вот ссылка на исходники где создается список: http://www.grepcode.com/file/repository ... r.java#801
Там в зависимости от выбранных настроек выбирается нужный layout. Найдите свой и используйте его.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Pavel A
Сообщения: 7
Зарегистрирован: 21 июн 2013, 15:16

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение Pavel A » 22 июн 2013, 07:55

Да не столько вопрос , рассуждение вслух , но за ссылку все равно спасибо . По исходнику получается , что используется select_dialog_item.xml , однако на самом деле используется select_dialog_item_holo.xml / Что самое печальное , не смотря на то , что данный вид отображения есть в SDK , Android Studio его в упор не видит (и в исходниках AlertDialog он не используется ), в общем перенес из SDK в проект , но что то странно это как то ..

в результате получилось следующее , может кому пригодиться .. готовое решение :Диалоговый список с хидером и футером ,реагирующими на касание

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

protected Dialog onCreateDialog(int id) {
       
     //таблица элементов "table1" с полем "name" их именований
        Cursor cursor_dialog = database.query("table1",null, null, null, null, null, null);break; 
      

        AlertDialog.Builder  adb = new AlertDialog.Builder(this);

        adb.setTitle("Элементы");

        adb.setCursor(cursor_dialog, new DialogInterface.OnClickListener() {
           public void onClick(DialogInterface dialog, int which) { 
               if (which == 0) dismissDialog(0); // нажали хидер [отменить] , закрыть диалоговое окно
               else if (which == cursor_dialog.getCount() + 1) DataBase.addNewItem(table1); //футер [добавить] - вызываем 
                                                                                                                         //DataBase.addNewItem для добавления элемента
               else updateDisplay();  // действия по клику на элементах списка 
           }
        }, "name");

        AlertDialog d = adb.create();
        ListView list = d.getListView();
        
// header.xml -шаблон для оформления вывода элемента с полем TextView text1
        View v_h = getLayoutInflater().inflate(R.layout.header, null); 
        ((TextView)v_h.findViewById(android.R.id.text1)).setText("[Отменить]");
        list.addHeaderView(v_h);

        View v_f = getLayoutInflater().inflate(R.layout.header, null);
        ((TextView)v_f.findViewById(android.R.id.text1)).setText("[Добавить]");
        list.addFooterView(v_f);

        return d;
    }
так же хотелось бы выслушать конструктивную критику по коду , только пожалуйста не о том , что onGreateDialog и связанные с ним методы обозначены , как устаревшие . Я вижу , что они зачеркнуты в IDE . разбираться с фрагментами мне пока нет времени
Последний раз редактировалось Pavel A 30 сен 2013, 07:13, всего редактировалось 6 раз.

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

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение KamiSempai » 22 июн 2013, 12:00

Pavel A писал(а):так же хотелось бы выслушать конструктивную критику по коду
Мне не нравятся имена переменных. Например, adb. Как это понимать? Я то знаю, что это означает AlertDialogBuilder, но если кода будет много сразу и не поймешь. Толи это AlertDialogBuilder толи AndroidDataBase.

Бросайте эту вредную студенческую привычку именования переменных.
Пишите как есть:
adb - alertDialogBuilder или dialogBuilder;
d - dialog;
v_h - headerView;
v_f - footerView;
.... и так далее.

По коду. Слушатели нажатия на текст футере и хедере не к месту. Их нажатия будут обработаны DialogInterface.OnClickListener.
Если wich = 0 значит нажат хедер, если футер wich = cursor_dialog.getCount() + 1. Индекс остальных строк будет сдвинут на 1 из за хедера. Если этого не учитывать можно напороться на ошибку.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Pavel A
Сообщения: 7
Зарегистрирован: 21 июн 2013, 15:16

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение Pavel A » 22 июн 2013, 18:47

по переменным - мне просто их лень писать , если честно :oops: пока тестирую , как будет работать , это код не из полноценного проекта .. а вообще , в "смутные" 90-ые ,под "Спектрум" ,когда писал на ассемблере , метки были из серии DFHYDFG - просто по клавиатуре потарабанил - и только намного позднее я узнал , что оказывается это анекдот такой :) // в общем , это лирика все , хотел сказать , что непонятные переменные меня не пугают уже много лет 8-)

за объяснения по слушателям огромное спасибо .. сам я только начинаю еще с Java вообще и android-ом в частности .. исправил в последнем примере у себя

razmus
Сообщения: 82
Зарегистрирован: 26 мар 2013, 10:47

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение razmus » 25 июн 2013, 16:33

Доброе время суток!
Попробовал сделать добавление и редактирование данных по Intent, с добавление все хорошо получилось, а вот с редактированием и сохранением пока никак.

Падает на попытке выполнить запрос с забором данных

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

    lvData.setOnItemClickListener(new OnItemClickListener() {

		@Override
		public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
				long arg3) {
				// TODO Auto-generated method stub
				long id = arg2;
				Intent i = db.getData(id);
				int getid = i.getIntExtra("id", 1);
			    String title = i.getStringExtra("title");
			    String body = i.getStringExtra("body");
			    String data = i.getStringExtra("data");

			Intent intent = new Intent(getApplicationContext(), TasksEdit.class);
			intent.putExtra("id", getid);
		    intent.putExtra("title", title.toString());
		    intent.putExtra("body", body.toString());
		    intent.putExtra("date", data.toString());
  	      	startActivityForResult(intent, 2);
		}
    });
    



protected void onActivityResult(int requestCode, int resultCode, Intent data) {
	    if (resultCode != RESULT_OK) {Toast.makeText(this, "Wrong result", Toast.LENGTH_SHORT).show(); return;}
	    switch (requestCode) {
		case 1:
		    String title = data.getStringExtra("title");
		    String body = data.getStringExtra("body");
			db.addRec(title, body, 
					new java.text.SimpleDateFormat("dd.MM.yy - HH:mm").format(java.util.Calendar.getInstance ().getTime()));
		    cursor.requery();	
			break;
		case 2:
			ContentValues c = null;
			int idData = 0;
			int id = data.getIntExtra("id", idData);
		    c.put("title", data.getStringExtra("title"));
		    c.put("body", data.getStringExtra("body"));
		    db.Update(id, c);
		    cursor.requery();	
			break;
		default:
			break;
		}


	  }

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

///DB.class
  public Intent getData(long id) {
	  String s = String.valueOf(id);
	    Intent cv = new Intent();
	    cv = (Intent) mDB.query(DB_TABLE, null, COLUMN_ID + " = " + id, null, s, s, s);
	      cv.putExtra("id", COLUMN_ID);
	      cv.putExtra("title", COLUMN_TITLE);
	      cv.putExtra("body", COLUMN_BODY);
	      cv.putExtra("date", COLUMN_DATE);
	return cv; 
  }

  public void Update(long id, ContentValues cv) {
		mDB.update("mytab", cv, "id = " + id, null);
	  }
Заранее благодарен!

З.Ы.
Подправил код.

razmus
Сообщения: 82
Зарегистрирован: 26 мар 2013, 10:47

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение razmus » 25 июн 2013, 18:01

Обновил код, но все же пока не работает

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

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение Foenix » 25 июн 2013, 18:49

где падает не понятно, какой лог тоже
R.id.team

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

razmus
Сообщения: 82
Зарегистрирован: 26 мар 2013, 10:47

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение razmus » 26 июн 2013, 00:57

Извините за беспокойство, уже разобрался))

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

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение Idol » 26 июн 2013, 04:42

Нигде не удалось найти примера изменения параметров (цвет или шрифт) элемента списка динамично, т.е. не в начале построения списка, как в уроках 49, 50. К примеру, менять цвет третьего элемента списка каждые 10сек. (используя SimpleCursorAdapter).

Заранее благодарен за совет.

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

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение Idol » 01 июл 2013, 01:00

Idol писал(а):Нигде не удалось найти примера изменения параметров (цвет или шрифт) элемента списка динамично, т.е. не в начале построения списка, как в уроках 49, 50. К примеру, менять цвет третьего элемента списка каждые 10сек. (используя SimpleCursorAdapter).
Это настолько сложно реализовать или просто форум не шибко активен?
Кто-нибудь хотя бы намекните в какую сторону копать.

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение rezak90 » 01 июл 2013, 07:50

Idol писал(а):
Idol писал(а):Нигде не удалось найти примера изменения параметров (цвет или шрифт) элемента списка динамично, т.е. не в начале построения списка, как в уроках 49, 50. К примеру, менять цвет третьего элемента списка каждые 10сек. (используя SimpleCursorAdapter).
Это настолько сложно реализовать или просто форум не шибко активен?
Кто-нибудь хотя бы намекните в какую сторону копать.
кастомный адаптер, в методе bindView меняем и цвет и шрифт и что хотим элементу... на счёт 10 сек то здесь вариантов куча, от запуска TimerTaska каждому item'y до запуска сервиса в котором крутится тот же TimerTask и каждые 10 сек будет обновлять cursor
R.id.team
Политика на форуме запрещена

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

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение Idol » 02 июл 2013, 02:40

rezak90 писал(а):кастомный адаптер, в методе bindView меняем и цвет и шрифт и что хотим элементу... на счёт 10 сек то здесь вариантов куча, от запуска TimerTaska каждому item'y до запуска сервиса в котором крутится тот же TimerTask и каждые 10 сек будет обновлять cursor
Я использую SimpleCursorAdapter.ViewBinder и меняю там формат текста и у меня есть место откуда вызывать изменение элементов списка (CountDownTimer). Однако я не могу уловить, как вызывать конкретный элемент списка. Как получить textView элемента списка?
Неужели в моем дизайне это не возможно и необходимо все переписать с bindView?

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение rezak90 » 02 июл 2013, 07:31

http://stackoverflow.com/questions/9658 ... f-textview
в setViewValue меняется цвет текста
R.id.team
Политика на форуме запрещена

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

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение Idol » 03 июл 2013, 02:43

rezak90 писал(а):http://stackoverflow.com/questions/9658 ... f-textview
в setViewValue меняется цвет текста
Спасибо за помощь.
Я правильно понимаю, что каждый раз, когда я хочу поменять цвет одного элемента списка, необходимо перерисовать весь список заново (кстати как это вызвать из произвольного места программы?). И не существует возможности перерисовать лишь этот изменяемый элемент?

Как найти необходимый элемент в setViewValue? У курсора нет метода типа getItem(position).

Если элемент списка состоит из нескольких объектов (textViews, etc), нужно прописать установку цвета в каждом объекте отдельно или есть возможность поменять цвет сразу у всего элемента списка?

Ответить