Урок 136. CursorLoader

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

Re: Урок 136. CursorLoader

Сообщение Foenix » 28 мар 2014, 11:31

Вроде бы все правильно теперь, единственное я бы
тут
if (s == null || s.equals("")) {

textview.setVisibility(View.GONE);

} else {

textview.setText(s);

}
в ветке else Сделала бы текствью видимым, т.к. в listview у нас по сути существуют лишь ВИДИМЫЕ строки в каждый момент времени плюс кажется 1 верхняя невидимая и 1 нижняя (так все устроено в нем с точки зрения распределения памяти). Поэтому делай в ветке else свой текствью видимым. И все должно быть в порядке.
R.id.team

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

ololosha
Сообщения: 19
Зарегистрирован: 04 янв 2013, 19:27

Re: Урок 136. CursorLoader

Сообщение ololosha » 28 мар 2014, 12:06

Да, действительно вьюхи содержащие комментарий больше не исчезают. Но как-то странно что им нужно включать видимость, ведь они и так должны быть видимы..
Теперь появился другой глюк. При старте приложения и отображении первых нескольких строк листвью (которые сразу влезают в экран) одна из строк содержит пустой текствью без комментария и этот текствью остается видимым, а при прокрутки туда-обратно (чтобы эта строка выходила за пределы экрана) он уже больше не появляется (хотя должен был сразу вообще не отображаться).
Получается в этом способе при начальной отрисовке экрана то что должно быть невидимым станет невидимым только после прокрутки?

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

Re: Урок 136. CursorLoader

Сообщение Foenix » 28 мар 2014, 12:24

ololosha писал(а):Да, действительно вьюхи содержащие комментарий больше не исчезают. Но как-то странно что им нужно включать видимость, ведь они и так должны быть видимы..
еще раз тебе повторяю - почитай об устройстве листвью и вопросы отпадут.
По второму - ищи ошибку в коде, такого быть не должно.
R.id.team

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

ololosha
Сообщения: 19
Зарегистрирован: 04 янв 2013, 19:27

Re: Урок 136. CursorLoader

Сообщение ololosha » 28 мар 2014, 12:49

Искать даже неизвестно где, ведь для пустых комментов метод textview.setVisibility(View.GONE) отрабатывает 100%, а элемент не исчезает...

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

Re: Урок 136. CursorLoader

Сообщение Foenix » 28 мар 2014, 13:15

не факт. Выводи логи для видимых или невидимых текствью, их содержимое. Может там он и не пустой на самом деле.
R.id.team

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

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

Re: Урок 136. CursorLoader

Сообщение klblk » 28 мар 2014, 13:22

думаю могу помочь:
[syntax=java]if (convertView != null) {
TextView textview = (TextView) convertView.findViewById(R.id.tvComment);[/syntax]
что собственно за фигня? причем тут convertView?

ololosha
Сообщения: 19
Зарегистрирован: 04 янв 2013, 19:27

Re: Урок 136. CursorLoader

Сообщение ololosha » 28 мар 2014, 13:38

Он пустой, это точно. В базе у меня для тестов 20 записей. В двух записях поле для комментария содержит пустую строку. В лог тоже выходит пустое значение.
На всякий случай попробовал еще способ, который показал alexmx, переделанный для себя и написал куда следует textviewComment.setVisibility(View.VISIBLE) - в результате получилось именно так как надо. Осталось остальным тексвью значения прописать и все.

ololosha
Сообщения: 19
Зарегистрирован: 04 янв 2013, 19:27

Re: Урок 136. CursorLoader

Сообщение ololosha » 28 мар 2014, 13:42

klblk писал(а):думаю могу помочь:
[syntax=java]if (convertView != null) {
TextView textview = (TextView) convertView.findViewById(R.id.tvComment);[/syntax]
что собственно за фигня? причем тут convertView?
Без него не работает.

03-28 10:40:57.015: E/AndroidRuntime(2037): java.lang.NullPointerException

ololosha
Сообщения: 19
Зарегистрирован: 04 янв 2013, 19:27

Re: Урок 136. CursorLoader

Сообщение ololosha » 28 мар 2014, 14:00

Заменил convertView на view и всё в порядке :D

[syntax=java]
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = super.getView(position, convertView, parent);

if (view != null) {
TextView textview = (TextView) view.findViewById(R.id.tvComment);
Cursor cursor = super.getCursor();

int beforePosition = cursor.getPosition();
cursor.moveToPosition(position);
int nowPosition = cursor.getPosition();
Log.d(LOG_TAG, "getView: beforePosition = " + beforePosition + " nowPosition = " + nowPosition);

int commentIndex = cursor.getColumnIndex("comment2");
String s = cursor.getString(commentIndex);
if (s == null || s.equals("")) {
textview.setVisibility(View.GONE);
Log.d(LOG_TAG, "getView: hiding");
} else {
//textview.setText(s);
textview.setVisibility(View.VISIBLE);
}
}
return view;
}
[/syntax]
Всем спасибо за участие :D

Gorets
Сообщения: 8
Зарегистрирован: 12 янв 2012, 12:38

Re: Урок 136. CursorLoader

Сообщение Gorets » 22 апр 2014, 20:40

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

  static class MyCursorLoader 

Зачем

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

 static 
?

точнее, понятно почему static, но как лучше сделать, если мне надо перезагружать его? менять запрос для курсора

Gorets
Сообщения: 8
Зарегистрирован: 12 янв 2012, 12:38

Re: Урок 136. CursorLoader

Сообщение Gorets » 22 апр 2014, 21:35

короче, дело в том что курсорЛоадеры хранятся где-то в своем волшебном мире и после рестарта активити(фрагмента) не обновляются, потому надо делать
getActivity().getSupportLoaderManager().restartLoader(0, null, this);

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

Re: Урок 136. CursorLoader

Сообщение Foenix » 22 апр 2014, 22:29

Gorets писал(а):короче, дело в том что курсорЛоадеры хранятся где-то в своем волшебном мире и после рестарта активити(фрагмента) не обновляются, потому надо делать
getActivity().getSupportLoaderManager().restartLoader(0, null, this);
обновляются, это делать не нужно, если у вас все остальное реализовано правильно.
R.id.team

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

arial
Сообщения: 3
Зарегистрирован: 02 май 2014, 21:19

Re: Урок 136. CursorLoader

Сообщение arial » 02 май 2014, 21:27

А как использовать функционал CursorLoader с двумя активити? Поясню чуть подробнее: есть приложение, в котором есть список пользователей (собственно, это стартовый экран). На этом экране помимо списка есть кнопка "добавить", которая переводит на другую активити, отвечающую за создание нового пользователя. Итого получается две активити - одна отвечает за вывод списка и в ней находится CursorLoader, а вторая - за создание пользователя, в ней нет CursorLoader. Как быть в таком случае? Не передавать же CursorLoader между этими активити. Использовать ContentProvider я не хочу, т.к. имхо тут он не к месту. В гугле все туториалы, которые мне попадались, либо похожи на этот урок в том плане, что в них все делается в рамках одной активити, либо исплоьзуют ContentProvider.
Заранее спасибо.

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

Re: Урок 136. CursorLoader

Сообщение Foenix » 02 май 2014, 21:30

Различайте
1. Данные (база данных)
2. Средство загрузки данных из п.1 в п.3 (лоадер)
3. Показ данных на экране (активити, вью)

Когда вы вставляете строку - то нужно вставлять ее в п.1 Данные ! Затем при возврате, если вы правильно используете курсорлоадер и контент-провайдер - все обновится автоматически.
R.id.team

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

arial
Сообщения: 3
Зарегистрирован: 02 май 2014, 21:19

Re: Урок 136. CursorLoader

Сообщение arial » 02 май 2014, 21:57

А как правильно исплоьзовать курсорлоадер, чтобы он знал, что ему нужно обновить данные после возвращения со второго экрана на первый? Есть какой-то способ помимо контентпровайдеров? В уроке за это отвечает метод
[syntax=java] // обработка нажатия кнопки
public void onButtonClick(View view) {
// добавляем запись
db.addRec("sometext " + (scAdapter.getCount() + 1), R.drawable.ic_launcher);
// получаем новый курсор с данными
getSupportLoaderManager().getLoader(0).forceLoad();
}[/syntax]
А в моем случае? Когда приложение возвращается в активити со списком, в которой был создан курсорлоадер? (сорри, может, коряво объясняю, но надеюсь, что мысль ясна)

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

Re: Урок 136. CursorLoader

Сообщение Foenix » 03 май 2014, 00:23

читайте урок о запуске активити с результатом и по результату допустим ОК перегружайте лоадер (в методе первой активити).
R.id.team

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

Аватара пользователя
Sharlei root
Сообщения: 1
Зарегистрирован: 03 май 2014, 02:02

Re: Урок 136. CursorLoader

Сообщение Sharlei root » 03 май 2014, 02:13

Приветствую всех вас, хотел вот задать вопрос, ответ на который, думается, будет максимально прост. Суть вот в чем: есть приложение с двумя+ активити, первое - меню, второе представляет из себя то, что разобрано в данном уроке. Из первого активити, нажатием на кнопку, должно вызываться второе. Вот только у меня приложение падает с сообщением, что оно stopped unexpectedly. Второе активити написано точь-в-точь как в уроке, разве что название другое. Из первого оно вызывается просто:

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

	case R.id.button2:
		Intent intent = new Intent(this, ActivityList.class);
		startActivity(intent);	
.
Так вот, что сделано мной не так?
ЗЫ.Если что, прошу вас, в гупости не обвиняйте, тапками не кидайте и не возводите очи горе, т.к. я еще новичок совсем. ;)

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

Re: Урок 136. CursorLoader

Сообщение KamiSempai » 03 май 2014, 12:32

Где логи?
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

siberprogs
Сообщения: 93
Зарегистрирован: 05 мар 2014, 06:20

Re: Урок 136. CursorLoader

Сообщение siberprogs » 03 май 2014, 17:41

Sharlei root писал(а): Из первого активити, нажатием на кнопку, должно вызываться второе. Вот только у меня приложение падает с сообщением, что оно stopped unexpectedly.
Может второе активити в манифесте не прописано?
Linux Fedora RFRemix + Intellij Idea

arial
Сообщения: 3
Зарегистрирован: 02 май 2014, 21:19

Re: Урок 136. CursorLoader

Сообщение arial » 08 май 2014, 18:06

Foenix писал(а):читайте урок о запуске активити с результатом и по результату допустим ОК перегружайте лоадер (в методе первой активити).
Феникс, спасибо за совет, помог! Проставил благодарность.

В уроке соединение с БД открывается при старте приложения и закрывается при выходе из него. Правильно ли я понимаю, что это сделано из-за наличия курсора и что если я хочу использовать контент провайдеры в рамках всего приложения, то мне с соединением так же следует поступить?

Ответить