Урок 136. CursorLoader
Re: Урок 136. CursorLoader
public Cursor getCity_CTO(String test)
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
Извеняюсь за вопрос сам разобрался =)
Re: Урок 136. CursorLoader
с горем пополам разобрался с cursorAdspter, но возник вопрос по кастомизации адаптера
мой item.xml
в li_t_XY надо вьівести строку формата "X="+DB.COLUMN_X+" Y="+DB.COLUMN_Y
киньте чето почитать, ибо ниче сам не нашел(
мой item.xml
Код: Выделить всё
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="50dp">
<TextView
android:layout_width="50dp"
android:layout_height="wrap_content"
android:id="@+id/li_t_picket"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentBottom="true"
android:gravity="center"
android:text="@string/st_picket" />
<TextView
android:layout_width="wrap_content"
android:layout_height="25dp"
android:text="New Text"
android:id="@+id/li_t_XY"
android:layout_alignParentTop="true"
android:layout_toRightOf="@+id/li_t_picket"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="New Text"
android:id="@+id/li_t_length"
android:layout_alignParentBottom="true"
android:layout_toRightOf="@+id/li_t_picket"
android:layout_below="@+id/li_t_XY"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true" />
</RelativeLayout>
киньте чето почитать, ибо ниче сам не нашел(
Re: Урок 136. CursorLoader
Добрый день.
Подскажите, пожалуйста, а если мне нужно получить данные с сервера, запись в локальную sqllite и отобразить с возможностью группировки, сортировки и поиска, использовать cursor loader или кастомный адаптер писать и поместить загрузку/отображение данных в поток?
Подскажите, пожалуйста, а если мне нужно получить данные с сервера, запись в локальную sqllite и отобразить с возможностью группировки, сортировки и поиска, использовать cursor loader или кастомный адаптер писать и поместить загрузку/отображение данных в поток?
Re: Урок 136. CursorLoader
Может уже задавали вопрос, не нашел ответа. Как сделать два ListView только с разными запросами в бд?
Не понял в какой момент можно врезаться. Сделал новую процедуру запроса но где его использовать (Создавать новый адаптер или как то можно наложить условие и выполнять свою процедуру). Если можно с примером буду благодарен.
Не понял в какой момент можно врезаться. Сделал новую процедуру запроса но где его использовать (Создавать новый адаптер или как то можно наложить условие и выполнять свою процедуру). Если можно с примером буду благодарен.
Re: Урок 136. CursorLoader
Прошу вашей помощи, уважаемые. У меня жёсткий ступор на этом уроке. Ругается в одном месте:
Не могу понять, почему ему этот this не нравится?
Класс у меня объявляется так
Класс MyCursorLoader
Доп.вопрос, почему (замечаю очень часто) вместо LoaderCallbacks, как указанно в примере, меня программа заставляет вставить LoaderManager.LoaderCallbacks ?
Искренне жду помощи.
Не могу понять, почему ему этот this не нравится?
Класс у меня объявляется так
Код: Выделить всё
public class MainActivity extends ActionBarActivity implements LoaderManager.LoaderCallbacks<Cursor> {
Код: Выделить всё
static class MyCursorLoader extends CursorLoader {
DB db;
public MyCursorLoader(Context context, DB db){
super(context);
this.db = db;
}
@Override
public Cursor loadInBackground() {
Cursor cursor = db.getAllData();
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
return cursor;
}
}
Искренне жду помощи.
Re: Урок 136. CursorLoader
Есть два Activity. В 1-м выводятся данные из БД, во 2-м создается новый поток AsyncTask, в котором выполняется загрузка данных и добавление их в БД.
Если загрузка и добавление данных выполнились до закрытия 2-й Activity, то в 1-й отображаемый список обновляется.
Если загрузка и добавление данных не завершились до закрытия 2-й Activity, то в 1-й соответственно список не обновляется.
Как и когда уведомить 1-ю Activity, что загрузка выполнилась и надо обновить список?
Если загрузка и добавление данных выполнились до закрытия 2-й Activity, то в 1-й отображаемый список обновляется.
Если загрузка и добавление данных не завершились до закрытия 2-й Activity, то в 1-й соответственно список не обновляется.
Как и когда уведомить 1-ю Activity, что загрузка выполнилась и надо обновить список?
Re: Урок 136. CursorLoader
1) использовать контент-провайдеры
2) не использовать асинктаск
2) не использовать асинктаск
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
Доброй ночи, товарищи.
Прошерстил множество примеров, так и не нашёл решения. Очень надеюсь на вашу помощь.
Предположим, что рассматриваем приложение ровно как в уроке, но с EditText вместо TextView. Как получить доступ к этим EditText'ам и повесить на них TextWatcher'ы? Прописать android:onClick в xml (как для кнопок) нельзя, надо присваивать обработчики программно, так вот в каком месте и в каком виде это можно сделать? По возможности прошу рабочий пример или кусок кода, потому что именно с CursorLoader'ом я ни одного рабочего примера не нашёл...
Спасибо.
Прошерстил множество примеров, так и не нашёл решения. Очень надеюсь на вашу помощь.
Предположим, что рассматриваем приложение ровно как в уроке, но с EditText вместо TextView. Как получить доступ к этим EditText'ам и повесить на них TextWatcher'ы? Прописать android:onClick в xml (как для кнопок) нельзя, надо присваивать обработчики программно, так вот в каком месте и в каком виде это можно сделать? По возможности прошу рабочий пример или кусок кода, потому что именно с CursorLoader'ом я ни одного рабочего примера не нашёл...
Спасибо.
Re: Урок 136. CursorLoader
вероятно, ты начал с 136 урока, а надо было сначала почитать
Вся эта элементарщина есть в первых уроках.
Вся эта элементарщина есть в первых уроках.
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
-
- Сообщения: 36
- Зарегистрирован: 28 июн 2015, 03:13
Re: Урок 136. CursorLoader
У меня такая же ошибка на this. Вы решили эту проблему?
getSupportLoaderManager().initLoader(0, null, this);
Error:(59, 34) error: method initLoader in class LoaderManager cannot be applied to given types;
required: int,Bundle,LoaderCallbacks<D>
found: int,<null>,MainActivity
reason: cannot infer type-variable(s) D
(argument mismatch; MainActivity cannot be converted to LoaderCallbacks<D>)
where D is a type-variable:
D extends Object declared in method <D>initLoader(int,Bundle,LoaderCallbacks<D>)
Очень прошу помощи.
getSupportLoaderManager().initLoader(0, null, this);
Error:(59, 34) error: method initLoader in class LoaderManager cannot be applied to given types;
required: int,Bundle,LoaderCallbacks<D>
found: int,<null>,MainActivity
reason: cannot infer type-variable(s) D
(argument mismatch; MainActivity cannot be converted to LoaderCallbacks<D>)
where D is a type-variable:
D extends Object declared in method <D>initLoader(int,Bundle,LoaderCallbacks<D>)
Очень прошу помощи.
-
- Сообщения: 36
- Зарегистрирован: 28 июн 2015, 03:13
Re: Урок 136. CursorLoader
Кажется проблема была в импорте.
К сожалению, в видео уроке импорт был скрыт.
Из-за этого пол дня пришлось разбираться.
А где текстовая версия урока? Или её вообще нет?
К сожалению, в видео уроке импорт был скрыт.
Из-за этого пол дня пришлось разбираться.
А где текстовая версия урока? Или её вообще нет?
Re: Урок 136. CursorLoader
Первое сообщение в теме->ссылкаK_Vladimir писал(а):Кажется проблема была в импорте.
К сожалению, в видео уроке импорт был скрыт.
Из-за этого пол дня пришлось разбираться.
А где текстовая версия урока? Или её вообще нет?
Re: Урок 136. CursorLoader
Если использовать версию API = 17, то выдает ошибку
Лечится переименовыванием БД из "mydb" в "mydb.db"
Мучался три дня
Код: Выделить всё
E/SQLiteLog﹕ (1) no such table: mytab
Мучался три дня
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
Философский вопрос! Читал честно и много из этой темы, но не всё, простите, если уже спрашивали.
Я понимаю, что SimpleCursorAdapter и всё остальное - устарело, но почему нельзя его использовать?
Если я правильно понял, то в документации написано, что проблема в том, что в старом методе всё
исполняется в главном потоке, и от этого все может повиснуть и приложение может не отвечать.
Тогда же можно просто создать отдельный поток и не мучаться со всеми лоадерами и всем остальным.
Или главная проблема в том, что за каждый проигнореный варнинг добавляется сто лет горения в аду?О_О
Я понимаю, что SimpleCursorAdapter и всё остальное - устарело, но почему нельзя его использовать?
Если я правильно понял, то в документации написано, что проблема в том, что в старом методе всё
исполняется в главном потоке, и от этого все может повиснуть и приложение может не отвечать.
Тогда же можно просто создать отдельный поток и не мучаться со всеми лоадерами и всем остальным.
Или главная проблема в том, что за каждый проигнореный варнинг добавляется сто лет горения в аду?О_О
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
Если во время работы лодера перевернуть устройство, то программа вылетает с ошибкой. видимо из за того активити повторно открывается. Посоветуйте как обойти эту ошибку?
Так же ошибка вылетает если запустить программу в одной ориентации, потом перевернуть устройство и нажать кнопку "добавить запись". Или любое другое действие с данными.
Так же ошибка вылетает если запустить программу в одной ориентации, потом перевернуть устройство и нажать кнопку "добавить запись". Или любое другое действие с данными.
- Mikhail_dev
- Сообщения: 2386
- Зарегистрирован: 09 янв 2012, 14:45
- Откуда: Самара
Re: Урок 136. CursorLoader
Сергей, научитесь сначала приводить логи с ошибкой. Буд то здесь всевидящие сидят, которые знают какая именно ошибка у вас.
Посмотрите этот вебинар, про LogCat
viewtopic.php?f=60&t=3198
Посмотрите этот вебинар, про LogCat
viewtopic.php?f=60&t=3198
-
- Сообщения: 3
- Зарегистрирован: 06 мар 2015, 22:41
Re: Урок 136. CursorLoader
Драсьте! Никак не получается обновить ListView во Fragment После удаления item.
После перехода из Активити добавления записи все обновляется через
А вот после удаления, приходится листать фрагменты чтобы удаленное содержимое пропало. Че не понял, че пропустил. Подскажите пожалуйста!
Вот весь код!
some fragment
После перехода из Активити добавления записи все обновляется через
Код: Выделить всё
@Override
public void onResume(){
super.onResume();
getActivity().getSupportLoaderManager().getLoader(0).forceLoad();
}
Код: Выделить всё
public boolean onContextItemSelected(MenuItem item) {
if (item.getItemId() == CM_DELETE_ID) {
// получаем из пункта контекстного меню данные по пункту списка
AdapterView.AdapterContextMenuInfo acmi = (AdapterView.AdapterContextMenuInfo) item
.getMenuInfo();
// извлекаем id записи и удаляем соответствующую запись в БД
db.deleteRow(acmi.id);
// получаем новый курсор с данными
getActivity().getSupportLoaderManager().getLoader(0).forceLoad();
return true;
}
some fragment
Код: Выделить всё
package comzaqxs.vk.com.fucktheorientation.Fragments;
import android.content.Context;
import android.database.Cursor;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.view.ContextMenu;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.Spinner;
import comzaqxs.vk.com.fucktheorientation.DBAdapter;
import comzaqxs.vk.com.fucktheorientation.R;
/**
* Created by Николай on 27.08.2015.
*/
public class MonthFragment extends Fragment implements LoaderCallbacks<Cursor> {
public static final String[] months = {"Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь"};
public static final String[] years = {"2015", "2016", "2017", "2018", "2019", "2020", "2021", "2022", "2023", "2024", "2025", "2026", "2027", "2028", "2029", "2030"};
private static final int CM_DELETE_ID = 1;
ListView lvMonth;
DBAdapter db;
SimpleCursorAdapter scAdapter;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.month_item, container, false);
db = new DBAdapter(getActivity());
db.open();
String[] fromFieldNames = new String[]{DBAdapter.KEY_DATE, DBAdapter.KEY_AREA, DBAdapter.KEY_PASSENGER};
int[] toViewsID = new int[]{R.id.tvItemDate, R.id.tvItemArea, R.id.tvItemPassenger};
scAdapter = new SimpleCursorAdapter(getActivity(), R.layout.item, null, fromFieldNames, toViewsID, 0);
lvMonth = (ListView)v.findViewById(R.id.lvMonth);
lvMonth.setAdapter(scAdapter);
lvMonth.setBackgroundColor(0xffFFFFFF);
registerForContextMenu(lvMonth);
getActivity().getSupportLoaderManager().initLoader(0, null, this);
Spinner monthsSpinner = (Spinner)v.findViewById(R.id.monthSpinner);
monthsSpinner.setBackgroundColor(0xffF44336);
ArrayAdapter<String> monthsAdapter = new ArrayAdapter<>(getActivity(), R.layout.my_spinner_gravity_center, months);
monthsAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
monthsSpinner.setAdapter(monthsAdapter);
monthsSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view,
int position, long id) {
// показываем позиция нажатого элемента МЕСЯЦ
//Toast.makeText(getBaseContext(), "Position = " + position, Toast.LENGTH_SHORT).show();
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
}
});
Spinner yearSpinner = (Spinner)v.findViewById(R.id.yearSpinner);
yearSpinner.setBackgroundColor(0xffF44336);
ArrayAdapter<String> yearAdapter = new ArrayAdapter<>(getActivity(), R.layout.my_spinner_gravity_center, years);
yearAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
yearSpinner.setAdapter(yearAdapter);
yearSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view,
int position, long id) {
// показываем позиция нажатого элемента МЕСЯЦ
//Toast.makeText(getBaseContext(), "Position = " + position, Toast.LENGTH_SHORT).show();
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
}
});
return v;
}
@Override
public void onResume(){
super.onResume();
getActivity().getSupportLoaderManager().getLoader(0).forceLoad();
}
public void onDestroy() {
super.onDestroy();
db.close();
}
public static MonthFragment newInstance() {
return new MonthFragment();
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle bndl) {
return new MyCursorLoader(getActivity(), db);
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
scAdapter.swapCursor(data);
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
}
static class MyCursorLoader extends CursorLoader {
DBAdapter db;
public MyCursorLoader(Context context, DBAdapter db) {
super(context);
this.db = db;
}
@Override
public Cursor loadInBackground() {
return db.getMonthRows();
}
}
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
menu.add(0, CM_DELETE_ID, 0, R.string.delete_record);
}
public boolean onContextItemSelected(MenuItem item) {
if (item.getItemId() == CM_DELETE_ID) {
// получаем из пункта контекстного меню данные по пункту списка
AdapterView.AdapterContextMenuInfo acmi = (AdapterView.AdapterContextMenuInfo) item
.getMenuInfo();
// извлекаем id записи и удаляем соответствующую запись в БД
db.deleteRow(acmi.id);
// получаем новый курсор с данными
getActivity().getSupportLoaderManager().getLoader(0).forceLoad();
return true;
}
return super.onContextItemSelected(item);
}
}