Страница 9 из 19

Re: Урок 136. CursorLoader

Добавлено: 28 мар 2014, 11:31
Foenix
Вроде бы все правильно теперь, единственное я бы
тут
if (s == null || s.equals("")) {

textview.setVisibility(View.GONE);

} else {

textview.setText(s);

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

Re: Урок 136. CursorLoader

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

Re: Урок 136. CursorLoader

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

Re: Урок 136. CursorLoader

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

Re: Урок 136. CursorLoader

Добавлено: 28 мар 2014, 13:15
Foenix
не факт. Выводи логи для видимых или невидимых текствью, их содержимое. Может там он и не пустой на самом деле.

Re: Урок 136. CursorLoader

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

Re: Урок 136. CursorLoader

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

Re: Урок 136. CursorLoader

Добавлено: 28 мар 2014, 13:42
ololosha
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

Re: Урок 136. CursorLoader

Добавлено: 28 мар 2014, 14:00
ololosha
Заменил 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

Re: Урок 136. CursorLoader

Добавлено: 22 апр 2014, 20:40
Gorets

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

  static class MyCursorLoader 

Зачем

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

 static 
?

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

Re: Урок 136. CursorLoader

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

Re: Урок 136. CursorLoader

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

Re: Урок 136. CursorLoader

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

Re: Урок 136. CursorLoader

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

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

Re: Урок 136. CursorLoader

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

Re: Урок 136. CursorLoader

Добавлено: 03 май 2014, 00:23
Foenix
читайте урок о запуске активити с результатом и по результату допустим ОК перегружайте лоадер (в методе первой активити).

Re: Урок 136. CursorLoader

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

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

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

Re: Урок 136. CursorLoader

Добавлено: 03 май 2014, 12:32
KamiSempai
Где логи?

Re: Урок 136. CursorLoader

Добавлено: 03 май 2014, 17:41
siberprogs
Sharlei root писал(а): Из первого активити, нажатием на кнопку, должно вызываться второе. Вот только у меня приложение падает с сообщением, что оно stopped unexpectedly.
Может второе активити в манифесте не прописано?

Re: Урок 136. CursorLoader

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

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