Урок 136. CursorLoader
Re: Урок 136. CursorLoader
ViewPager, Glide.
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.
Re: Урок 136. CursorLoader
Большое спасибо!
Re: Урок 136. CursorLoader
Доброго времени суток.
В начале пути изучения.
Есть тема Урок 110. Android 3. Fragments. DialogFragment - диалог и Урок 136. CursorLoader.
Задача: Прочитать БД и передать в диалоговое окно.
Привожу код MainActivity
Этот адаптер надо прочитать в auto.java
И вот тут загвоздка. Я потерялся. Как получить в auto.java этот адаптер?
В начале пути изучения.
Есть тема Урок 110. Android 3. Fragments. DialogFragment - диалог и Урок 136. CursorLoader.
Задача: Прочитать БД и передать в диалоговое окно.
Привожу код MainActivity
Код: Выделить всё
cursor = db.readyDB("auto", null, selection, selectionArgs, null, null, null);
userAdapter = new SimpleCursorAdapter(this, R.layout.auto, cursor, fromStr, toInt, 0);
dialog.show(getFragmentManager(), "dialog");
Код: Выделить всё
public class auto extends DialogFragment implements OnClickListener {
final String LOG_TAG = "myLogs";
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
getDialog().setTitle(R.string.auto);
View view = inflater.inflate(R.layout.auto, null);
return view;
}
Последний раз редактировалось correptum 19 окт 2015, 22:34, всего редактировалось 1 раз.
Re: Урок 136. CursorLoader
а никак. Создавать адаптер нужно по уроку прямо в диалоге, если тебе там нужен список. !передать бд" в диалог - как-то неправильно звучит.
R.id.team
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
Re: Урок 136. CursorLoader
Передать выборку в диалог, даже более точнее - cursor.Foenix писал(а):а никак. Создавать адаптер нужно по уроку прямо в диалоге, если тебе там нужен список. !передать бд" в диалог - как-то неправильно звучит.
Тогда я еще больше потерялся. Буду разбираться.
Может есть понятно расписанная инфа по данному вопросу?
Re: Урок 136. CursorLoader
все делается аналогично активити, только в фрагменте диалога.
R.id.team
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
Re: Урок 136. CursorLoader
т.е. мне в auto.jave создавать запрос к БД и т.д.?Foenix писал(а):все делается аналогично активити, только в фрагменте диалога.
Как я понимаю.
Создал отдельный layout и java класс для диалогового окна.
В классе я прописываю вывод диалогового окна и должен прописать SimpleCursorAdapter. SimpleCursorAdapter должен получить cursor, который формируется в основной layout. Значит надо организовать как-то передачу этого cursor.
Либо формировать cursor непосредственно в java диалогового окна. НО тогда необходимо передать из основного layout условия для чтения БД.
Объясните, плиз, как тут мне быть.
-
- Сообщения: 1
- Зарегистрирован: 01 окт 2015, 18:07
Re: Урок 136. CursorLoader
Моя база примерно 2-3 секунды обрабатывает запрос, могу ли я отобразить круглый прогресс перед показом списка? Почему-то никак не получается.
Я попробовал поставить круглый прогресс на layout. Он у всегда видимый (всегда крутится).
Выполняю по нажатию кнопки вот этот код и он почемуто выполняется в UI-потоке, прогресс перестает крутиться пока идет обработка.
Может как-то можно перенести этот код в отдельный поток. У меня не получилось - функции матерятся на LoaderCallbacks.
Тут даже скорее другая проблема. Сейчас сделал без лоадера. Та же проблема.
Оказывается обработка базы данных происходит мгновенно, а вот построение ListView идёт 2-3 секунды и соответственно вызывает остановку прогресса.
Можно ли от этого избавиться, или вместо прогресса придется всётаки использовать статичный TextView с текстом "Построение списка..."?
Я попробовал поставить круглый прогресс на layout. Он у всегда видимый (всегда крутится).
Выполняю по нажатию кнопки вот этот код и он почемуто выполняется в UI-потоке, прогресс перестает крутиться пока идет обработка.
Код: Выделить всё
db = new DB(this, null);
db.open();
// формируем столбцы сопоставления
String[] from = {"fio", "adr", "prich", "datr", "p_u"};
int[] to = new int[] { R.id.tvText1, R.id.tvText2, R.id.tvText3, R.id.tvText4, R.id.tvText5 };
// создаем адаптер и настраиваем список
scAdapter = new SimpleCursorAdapter(this, R.layout.fio_item, null, from, to, 0);
scAdapter.setViewBinder(new MyViewBinder());
lvData = (ListView) findViewById(R.id.lvData);
lvData.setAdapter(scAdapter);
// создаем лоадер для чтения данных
getSupportLoaderManager().initLoader(0, null, this);
Тут даже скорее другая проблема. Сейчас сделал без лоадера. Та же проблема.
Оказывается обработка базы данных происходит мгновенно, а вот построение ListView идёт 2-3 секунды и соответственно вызывает остановку прогресса.
Можно ли от этого избавиться, или вместо прогресса придется всётаки использовать статичный TextView с текстом "Построение списка..."?
Re: Урок 136. CursorLoader
можно ли взамен onCreate/onDestroy создавать и закрывать БД в onResumed/onPaused. При нажатии кнопки Home, принятии входного звонка активити уходит из видимости и база висит открытой, если юзать onResumed/onPaused такого не происходит
Re: Урок 136. CursorLoader
подскажите, чем отличаются классы
от
Со вторыми, программа ругается, то ей MainActivity не нравится, то не может MyCursorLoader в Cursor преобразовать.
С виду, реализация их одинакова, отличаются комментарии к классам, в библиотеке support.v4 там написано про какой-то фреймворк.
Код: Выделить всё
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
Код: Выделить всё
import android.content.CursorLoader;
import android.content.Loader;
С виду, реализация их одинакова, отличаются комментарии к классам, в библиотеке support.v4 там написано про какой-то фреймворк.
Re: Урок 136. CursorLoader
Доброго времени суток.
Есть такая задача: содержимое тоже, что и в уроке 136, но имеются две кнопки, при нажатии на которые меняется база данных. Как обновить содержимое listView? Так как при нажатии, допустим, на вторую кнопку (к ней привязана бд, но не та, которая грузиться по дефолту), добавляется запись в эту, вторую бд, однако в listView данные остаются от первой таблицы, которая загружается по дефолту.
upd: getSupportLoaderManager().restartLoader().
Есть такая задача: содержимое тоже, что и в уроке 136, но имеются две кнопки, при нажатии на которые меняется база данных. Как обновить содержимое listView? Так как при нажатии, допустим, на вторую кнопку (к ней привязана бд, но не та, которая грузиться по дефолту), добавляется запись в эту, вторую бд, однако в listView данные остаются от первой таблицы, которая загружается по дефолту.
upd: getSupportLoaderManager().restartLoader().
Re: Урок 136. CursorLoader
используя контент провайдер посылай нотифай там именно тому набору данных, который выбирается в листвью. Тогда оно само обновится и не нужно будет рестартовать лоадер, что неправильно.yume писал(а):Доброго времени суток.
Есть такая задача: содержимое тоже, что и в уроке 136, но имеются две кнопки, при нажатии на которые меняется база данных. Как обновить содержимое listView? Так как при нажатии, допустим, на вторую кнопку (к ней привязана бд, но не та, которая грузиться по дефолту), добавляется запись в эту, вторую бд, однако в listView данные остаются от первой таблицы, которая загружается по дефолту.
upd: getSupportLoaderManager().restartLoader().
R.id.team
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
Re: Урок 136. CursorLoader
Спасибо.Foenix писал(а):используя контент провайдер посылай нотифай там именно тому набору данных, который выбирается в листвью. Тогда оно само обновится и не нужно будет рестартовать лоадер, что неправильно.
Ещё такой вопрос: как выводить список таким образом, чтобы добавленные записи были вверху, а не снизу?
-
- Сообщения: 9
- Зарегистрирован: 15 мар 2016, 03:10
Re: Урок 136. CursorLoader
Запрос поправитьyume писал(а):
Ещё такой вопрос: как выводить список таким образом, чтобы добавленные записи были вверху, а не снизу?
Код: Выделить всё
public Cursor getAllData() {
return mDB.query(TABLE, null, null, null, null, null, "_id DESC");//null
}
Re: Урок 136. CursorLoader
Для этого и для других вещей всегда обычно в таблице завожу поле с датой создания/редактирования записи. Потом по нему сортируй, например, и все.yume писал(а):Спасибо.Foenix писал(а):используя контент провайдер посылай нотифай там именно тому набору данных, который выбирается в листвью. Тогда оно само обновится и не нужно будет рестартовать лоадер, что неправильно.
Ещё такой вопрос: как выводить список таким образом, чтобы добавленные записи были вверху, а не снизу?
R.id.team
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
Re: Урок 136. CursorLoader
Кошки Рулят писал(а):Запрос поправитьКод: Выделить всё
public Cursor getAllData() { return mDB.query(TABLE, null, null, null, null, null, "_id DESC");//null }
Благодарю!Foenix писал(а):Для этого и для других вещей всегда обычно в таблице завожу поле с датой создания/редактирования записи. Потом по нему сортируй, например, и все.
Re: Урок 136. CursorLoader
Третий день разбираюсь с кастомизацией.
Задача внутри каждого элемента ListView передать и отбразить значение своего SeekBar.
Взял как в уроке Кастомный адаптер. С кнопками нет проблем. А вот с SeekBar прошу помочь показать как его увязать с TextView.
Логи работают нормально.
====================================
Изменил адаптер на обычный, расширенный с ViewBinder
Теперь почему-то SeekBar не может инициализироваться и всплывает ошибка
java:67 это строка
И второе - если раскомментить
то пишет, что попытка доступа в inner class к view - ошибка!
Задача внутри каждого элемента ListView передать и отбразить значение своего SeekBar.
Взял как в уроке Кастомный адаптер. С кнопками нет проблем. А вот с SeekBar прошу помочь показать как его увязать с TextView.
Код: Выделить всё
class TmpSimpleCursorAdapter extends SimpleCursorAdapter {
public TmpSimpleCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to, int flags) {
super(context, layout, c, from, to, flags);
}
@Override
public View newView(Context _context, Cursor _cursor, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) _context.getSystemService(_context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.row_item_temperature, parent, false);
return view;
}
@Override
public void bindView(View view, Context Context, final Cursor cursor) {
String title = cursor.getString(cursor.getColumnIndex(DBTemperature.COLUMN_TITLE));
roomTitleTmp = (TextView) view.findViewById(R.id.roomTitleTmp);
roomTitleTmp.setText(title);
temperature = (TextView) view.findViewById(R.id.roomTemperature);
adjust = (TextView) view.findViewById(R.id.adjustTemperature);
SeekBar seekBar = (SeekBar) view.findViewById(R.id.seekBar);
adjust.setText("+" + seekBar.getProgress());
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
int progress = 0;
@Override
public void onProgressChanged(SeekBar seekBar, int progressValue, boolean fromUser) {
progress = progressValue;
adjust.setText("+" + progress);
Log.d(MEGA, "Progress Changed");
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
Log.d(MEGA, "Progress Started");
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
Log.d(MEGA, "Progress Stopped");
}
});
}
}
====================================
Изменил адаптер на обычный, расширенный с ViewBinder
Код: Выделить всё
public class FragmentTemperatureDB extends Fragment implements LoaderCallbacks<Cursor> {
ListView lvTemperature;
DBTemperature dbHelperTmp;
SimpleCursorAdapter dataAdapterTmp;
int LIST_TMP_ID = 0;
ActionMode tmpActionMode;
private int operatePosition = 0;
final static String MEGADOR = "megadr";
public FragmentTemperatureDB() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View vTemperatures = inflater.inflate(R.layout.fragment_thermal, container, false);
// Initialize data for ListView
dbHelperTmp = new DBTemperature(FragmentTemperatureDB.this.getActivity());
dbHelperTmp.open();
String[] from = new String[] { DBTemperature.COLUMN_TITLE,
DBTemperature.COLUMN_CURRENT_TEMP,
DBTemperature.COLUMN_ADJUST_TEMP};
int[] to = new int[] { R.id.roomTitleTmp,
R.id.roomTemperature,
R.id.adjustTemperature};
// Setup Adapter for ListView
dataAdapterTmp = new SimpleCursorAdapter(FragmentTemperatureDB.this.getActivity(),
R.layout.row_item_temperature, null, from, to, LIST_TMP_ID);
dataAdapterTmp.setViewBinder(new SimpleCursorAdapter.ViewBinder() {
public boolean setViewValue(View view, Cursor cursor, int columnIndex) {
if (columnIndex == cursor.getColumnIndex(DBTemperature.COLUMN_ADJUST_TEMP)) {
int adjustProgress = cursor.getInt(columnIndex);
SeekBar seekBar = (SeekBar) view.findViewById(R.id.seekBar);
((TextView) view).setText("++" + adjustProgress);
seekBar.setProgress(adjustProgress);
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progressValue, boolean fromUser) {
((TextView) view).setText("+" + progressValue);
Log.d(MEGADOR, "Progress Changed: " + "+" + progressValue);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
Log.d(MEGADOR, "Progress Started:");
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
Log.d(MEGADOR, "Progress Stopped");
}
});
return true;
}
return false;
}
});
lvTemperature = (ListView) vTemperatures.findViewById(R.id.temperatureListView);
lvTemperature.setAdapter(dataAdapterTmp);
setHasOptionsMenu(true);
lvTemperature.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int pos, long id) {
operatePosition = pos;
tmpActionMode = FragmentTemperatureDB.this.getActivity().startActionMode(new ActionBarCallBack());
return true;
}
});
// Make loader for getting data
getLoaderManager().initLoader(LIST_TMP_ID, null, this);
// Inflate the layout for this fragment
return vTemperatures;
}
Код: Выделить всё
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.SeekBar.setProgress(int)' on a null object reference
at com.gigavar.adkmegador01.FragmentTemperatureDB$1.setViewValue(FragmentTemperatureDB.java:67)
Код: Выделить всё
seekBar.setProgress(adjustProgress);
Код: Выделить всё
// ((TextView) view).setText("+" + progressValue);
- Вложения
-
- Снимок экрана 2016-03-29 в 16.10.13.png (33.77 КБ) 14392 просмотра
Re: Урок 136. CursorLoader
Вернулся к кастомному SimpleCursoreAdapter.
На всякий случай поставил ViewHolder (однако, как я понимаю он просто экономит время при обращении к ресурсам).
Получил от SeekBar родительский layout
и уже в нем нашел TextView, который хотел изменить
В итоге получилось то, что надо:
На всякий случай поставил ViewHolder (однако, как я понимаю он просто экономит время при обращении к ресурсам).
Код: Выделить всё
static class ViewHolder {
TextView roomTitleTmp;
TextView adjust;
TextView temperature;
SeekBar seekBar;
}
и уже в нем нашел TextView, который хотел изменить
Код: Выделить всё
viewHolder.adjust = (TextView) ((View)seekBar.getParent()).findViewById(R.id.adjustTemperature);
В итоге получилось то, что надо:
Код: Выделить всё
class TmpSimpleCursorAdapter extends SimpleCursorAdapter {
public TmpSimpleCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to, int flags) {
super(context, layout, c, from, to, flags);
}
ViewHolder viewHolder;
@Override
public View newView(Context _context, Cursor _cursor, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) _context.getSystemService(_context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.row_item_temperature, parent, false);
return view;
}
@Override
public void bindView(View view, Context Context, final Cursor cursor) {
String title = cursor.getString(cursor.getColumnIndex(DBTemperature.COLUMN_TITLE));
viewHolder = new ViewHolder();
viewHolder.roomTitleTmp = (TextView) view.findViewById(R.id.roomTitleTmp);
viewHolder.roomTitleTmp.setText(title);
viewHolder.temperature = (TextView) view.findViewById(R.id.roomTemperature);
viewHolder.adjust = (TextView) view.findViewById(R.id.adjustTemperature);
viewHolder.seekBar = (SeekBar) view.findViewById(R.id.seekBar);
viewHolder.adjust.setText("+" + viewHolder.seekBar.getProgress());
viewHolder.seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progressValue, boolean fromUser) {
viewHolder.adjust = (TextView) ((View)seekBar.getParent()).findViewById(R.id.adjustTemperature);
viewHolder.adjust.setText("+" + progressValue);
Log.d(MEGA, "Progress Changed");
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
Log.d(MEGA, "Progress Started");
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
Log.d(MEGA, "Progress Stopped");
}
});
}
}
Re: Урок 136. CursorLoader
Все работает, хороший пример.
Но если добавить в item "button", то item перестает выделяться и не возможно удалить item. не работает удаление.
Как это реализовать, я так понял что если добавить button он ожидает действия, а item не работает.
Кто знает почему?
Но если добавить в item "button", то item перестает выделяться и не возможно удалить item. не работает удаление.
Как это реализовать, я так понял что если добавить button он ожидает действия, а item не работает.
Кто знает почему?
Re: Урок 136. CursorLoader
Всем привет. Решил на основе данного урока потренировать/разобраться в поиске по БД (или сортировке). Почитал/посмотрел, увидел и решил попробовать следующее:
Слово вводиться в SearchView, находящийся на Menu Bar. В результате получаю краш программы с NullPointerException. Объясните пожалуйста, каким образом можно организовать поиск/сортировку в данной ситуации? Является ли способ описанный выше рабочим и если я что-то не так делаю, то что? Буду очень благодарен любой помощи/примерам.
Код: Выделить всё
sv = (android.widget.SearchView) findViewById(R.id.action_search);
sv.setOnQueryTextListener(new android.widget.SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
scAdapter.getFilter().filter(newText);
return false;
}
});