Урок 52. SimpleCursorAdapter, пример использования
Re: Урок 52. SimpleCursorAdapter, пример использования
Пользуясь случаем, хочу выразить благодарность за данный урок ну и за остальные тоже.
В данном уроке есть одна маленькая неувязочка, не могу по приведенной ссылке найти ничего про edit.
Мы рассмотрели возможность добавления и удаления записей в списке при использовании SimpleCursorAdapter. Возможность редактирования я рассматривать не стал. Для тех, кому интересно редактирование – гугл любезно создал такой пример на официальном сайте - http://developer.android.com/resources/ ... index.html. Мой пример похож на него, так что будет проще разобраться.
То ли я не умею пользоваться http://developer.android.com,
то ли по по приведенной ссылке нету ничего ни про edit, ни про похожий пример.
А мне это очень нужно. ПЛЗ ткните мордочкой в пример с edit, если он всё-таки существует.
В данном уроке есть одна маленькая неувязочка, не могу по приведенной ссылке найти ничего про edit.
Мы рассмотрели возможность добавления и удаления записей в списке при использовании SimpleCursorAdapter. Возможность редактирования я рассматривать не стал. Для тех, кому интересно редактирование – гугл любезно создал такой пример на официальном сайте - http://developer.android.com/resources/ ... index.html. Мой пример похож на него, так что будет проще разобраться.
То ли я не умею пользоваться http://developer.android.com,
то ли по по приведенной ссылке нету ничего ни про edit, ни про похожий пример.
А мне это очень нужно. ПЛЗ ткните мордочкой в пример с edit, если он всё-таки существует.
Re: Урок 52. SimpleCursorAdapter, пример использования
ты по этой ссылке не видишь примера? печально, как же тебе тяжело то приходится...
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
Re: Урок 52. SimpleCursorAdapter, пример использования
Подскажите, пожалуйста, кто знает, можно ли решить такую проблему?
Задача: получать данные с сервера, складировать в БД и отображать в ListView.
Вначале было реализовано через DBHelper и CustomCursorAdapter. Главная активити, в AsyncTask получаю данные в JSON (10 элементов), разбираю, сгружаю в БД, получаю курсор на эти элементы и отображаю их. При скролле списка до посленего элемента повторяю для следующих 10-ти, кладу в БД, курсор получаю уже на 20 элементов и т.д. Смысл в том, что если нет соединения, то в БД ничего не пойдет, а из нее старые элементы отобразятся.
Все работало, хотя время от времени проскакивали ошибки об закрытии уже закрытого курсора (т.к. пытался его менеджить сам) Хотел переписать по всем правилам через ContentProvider с CursorLoader, что бы было совсем хорошо.
Тут внезапно поставили дополнительное условие: отображать через каждые несколько элементов списка кастомные блоки (рекламные), причем это число задается динамически с сервера и тоже не постоянное.
Нашел, как реализовать при помощи двух BaseAdapter'ов, быстренько накидал поверх - работает. Но это не то, что я хотел, поэтому начал искать варианты, как вставлять данные через CursorAdapter, все что удалось найти на эту тему это MatrixCursor+MergeCursor, но мне это не подойдет, если я не ошибаюсь.
Есть еще мысль при обновлении БД добавлять специальные элементы с нужной частотой, но этот вариант кажется мне наименее верным.
--------
Собственно вопрос в том, можно ли реализовать ListView+CursorAdapter с кастомными повторяющимися элементами, или же единственный выход коллекция+BaseAdapter?
Задача: получать данные с сервера, складировать в БД и отображать в ListView.
Вначале было реализовано через DBHelper и CustomCursorAdapter. Главная активити, в AsyncTask получаю данные в JSON (10 элементов), разбираю, сгружаю в БД, получаю курсор на эти элементы и отображаю их. При скролле списка до посленего элемента повторяю для следующих 10-ти, кладу в БД, курсор получаю уже на 20 элементов и т.д. Смысл в том, что если нет соединения, то в БД ничего не пойдет, а из нее старые элементы отобразятся.
Все работало, хотя время от времени проскакивали ошибки об закрытии уже закрытого курсора (т.к. пытался его менеджить сам) Хотел переписать по всем правилам через ContentProvider с CursorLoader, что бы было совсем хорошо.
Тут внезапно поставили дополнительное условие: отображать через каждые несколько элементов списка кастомные блоки (рекламные), причем это число задается динамически с сервера и тоже не постоянное.
Нашел, как реализовать при помощи двух BaseAdapter'ов, быстренько накидал поверх - работает. Но это не то, что я хотел, поэтому начал искать варианты, как вставлять данные через CursorAdapter, все что удалось найти на эту тему это MatrixCursor+MergeCursor, но мне это не подойдет, если я не ошибаюсь.
Есть еще мысль при обновлении БД добавлять специальные элементы с нужной частотой, но этот вариант кажется мне наименее верным.
--------
Собственно вопрос в том, можно ли реализовать ListView+CursorAdapter с кастомными повторяющимися элементами, или же единственный выход коллекция+BaseAdapter?
- KamiSempai
- Сообщения: 1339
- Зарегистрирован: 17 фев 2012, 21:23
- Откуда: Мордор
Re: Урок 52. SimpleCursorAdapter, пример использования
Стоп, а чем не понравился вариант по ссылке. CursorAdapter является потомком BaseAdapter и можно передавать в качестве delegate CursorAdapter.
Получится очень удобно, основной адаптер занимается отображением строк из базы, а декоратор вставкой рекламных блоков.
Или вся загвоздка в том, что эти блоки должны быть в случайном порядке?
Получится очень удобно, основной адаптер занимается отображением строк из базы, а декоратор вставкой рекламных блоков.
Или вся загвоздка в том, что эти блоки должны быть в случайном порядке?
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.
Хватит таскать макулатуру на тренировку! Используй T Note.
Re: Урок 52. SimpleCursorAdapter, пример использования
В очередной раз убеждаюсь, что часто решение лежит на поверхности. Благодарю, взлетело.
- KamiSempai
- Сообщения: 1339
- Зарегистрирован: 17 фев 2012, 21:23
- Откуда: Мордор
Re: Урок 52. SimpleCursorAdapter, пример использования
Небольшое замечание по поводу примера по ссылке. Для того, что бы курсор оповещал список об изменениях в базе, нужно переопределить пару методов в ListViewExampleListAdapter.
[syntax=java5] @Override
public void registerDataSetObserver(DataSetObserver observer) {
super.registerDataSetObserver(observer);
delegate.registerDataSetObserver(observer);
}
@Override
public void unregisterDataSetObserver(DataSetObserver observer) {
super.unregisterDataSetObserver(observer);
delegate.unregisterDataSetObserver(observer);
}[/syntax]
Если так не сделать, delegate адаптер не сможет оповестить список об изменениях в данных, а вызовы notifyDataSetChanged и notifyDataSetInvalidated, этого адаптера(для ListViewExampleListAdapter все будет нормально), будут проходить в пустую.
[syntax=java5] @Override
public void registerDataSetObserver(DataSetObserver observer) {
super.registerDataSetObserver(observer);
delegate.registerDataSetObserver(observer);
}
@Override
public void unregisterDataSetObserver(DataSetObserver observer) {
super.unregisterDataSetObserver(observer);
delegate.unregisterDataSetObserver(observer);
}[/syntax]
Если так не сделать, delegate адаптер не сможет оповестить список об изменениях в данных, а вызовы notifyDataSetChanged и notifyDataSetInvalidated, этого адаптера(для ListViewExampleListAdapter все будет нормально), будут проходить в пустую.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.
Хватит таскать макулатуру на тренировку! Используй T Note.
Re: Урок 52. SimpleCursorAdapter, пример использования
Ребята, а можно еще одно текстовое поле добавить к ListView, если по этому уроку делать, а то чет я добавил, а приложение вылетает на создании списка((
Re: Урок 52. SimpleCursorAdapter, пример использования
как же ты дальше программировать будешь? гадать каждый раз где ошибка? все есть в логе!volboy писал(а):Ребята, а можно еще одно текстовое поле добавить к ListView, если по этому уроку делать, а то чет я добавил, а приложение вылетает на создании списка((
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: Урок 52. SimpleCursorAdapter, пример использования
Да как бы были сомнения что вообще можно так, поэтому и спросил а логи вот:Foenix писал(а):как же ты дальше программировать будешь? гадать каждый раз где ошибка? все есть в логе!volboy писал(а):Ребята, а можно еще одно текстовое поле добавить к ListView, если по этому уроку делать, а то чет я добавил, а приложение вылетает на создании списка((
Код: Выделить всё
02-18 16:43:33.505: W/dalvikvm(331): threadid=1: thread exiting with uncaught exception (group=0x40015560)
02-18 16:43:33.545: E/AndroidRuntime(331): FATAL EXCEPTION: main
02-18 16:43:33.545: E/AndroidRuntime(331): java.lang.IllegalArgumentException: column 'ratio' does not exist
02-18 16:43:33.545: E/AndroidRuntime(331): at android.database.AbstractCursor.getColumnIndexOrThrow(AbstractCursor.java:314)
02-18 16:43:33.545: E/AndroidRuntime(331): at android.support.v4.widget.SimpleCursorAdapter.findColumns(SimpleCursorAdapter.java:317)
02-18 16:43:33.545: E/AndroidRuntime(331): at android.support.v4.widget.SimpleCursorAdapter.swapCursor(SimpleCursorAdapter.java:328)
Re: Урок 52. SimpleCursorAdapter, пример использования
Вроде как говорит, что не видит столбец "ratio", на я ж создал его....или я дурилка)?
Код: Выделить всё
public static final String COLUMN_ID = "_id";
public static final String COLUMN_IMG = "img";
public static final String COLUMN_TXT = "txt";
public static final String COLUMN_RATIO = "ratio";
private static final String DB_CREATE =
"create table " + DB_TABLE + "(" +
COLUMN_ID + " integer primary key autoincrement, " +
COLUMN_IMG + " integer, " +
COLUMN_TXT + " text, " + COLUMN_RATIO + " text "+
");";
Re: Урок 52. SimpleCursorAdapter, пример использования
значит, туда, куда ты пытаешься вставлять данные- нет такой колонки. Я ж не вижу где это. ниже в логе есть адрес в твоей программе, щелкай туда - переместишься на ошибку..
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: Урок 52. SimpleCursorAdapter, пример использования
Что то не получается ничего, перемещает в MainActivity на строкуFoenix писал(а):значит, туда, куда ты пытаешься вставлять данные- нет такой колонки. Я ж не вижу где это. ниже в логе есть адрес в твоей программе, щелкай туда - переместишься на ошибку..
Код: Выделить всё
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
scAdapter.swapCursor(cursor);
Код: Выделить всё
package com.example.myApp;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
public class DB {
private static final String DB_NAME = "mydb";
private static final int DB_VERSION = 1;
private static final String DB_TABLE = "mytab";
public static final String COLUMN_ID = "_id";
public static final String COLUMN_IMG = "img";
public static final String COLUMN_TXT = "txt";
public static final String COLUMN_RATIO = "rto";
private static final String DB_CREATE =
"create table " + DB_TABLE + "(" +
COLUMN_ID + " integer primary key autoincrement, " +
COLUMN_IMG + " integer," +
COLUMN_TXT + " text," + COLUMN_RATIO + " text" +
");";
private final Context mCtx;
private DBHelper mDBHelper;
private SQLiteDatabase mDB;
public DB(Context ctx) {
mCtx = ctx;
}
// открыть подключение
public void open() {
mDBHelper = new DBHelper(mCtx, DB_NAME, null, DB_VERSION);
mDB = mDBHelper.getWritableDatabase();
}
// закрыть подключение
public void close() {
if (mDBHelper!=null) mDBHelper.close();
}
// получить все данные из таблицы DB_TABLE
public Cursor getAllData() {
return mDB.query(DB_TABLE, null, null, null, null, null, null);
}
// добавить запись в DB_TABLE
public void addRec(String txt, String rto, int img) {
ContentValues cv = new ContentValues();
cv.put(COLUMN_TXT, txt);
cv.put(COLUMN_IMG, img);
cv.put(COLUMN_RATIO, rto);
mDB.insert(DB_TABLE, null, cv);
}
// удалить запись из DB_TABLE
public void delRec(long id) {
mDB.delete(DB_TABLE, COLUMN_ID + " = " + id, null);
}
// редактировать запись из DB_TABLE
public void editRec(String txt, int img, long id) {
ContentValues cv = new ContentValues();
cv.put(COLUMN_TXT, txt);
cv.put(COLUMN_IMG, img);
mDB.update(DB_TABLE, cv, COLUMN_ID + " = " + id, null);
}
// класс по созданию и управлению БД
private class DBHelper extends SQLiteOpenHelper {
public DBHelper(Context context, String name, CursorFactory factory,
int version) {
super(context, name, factory, version);
}
// создаем и заполняем БД
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(DB_CREATE);
ContentValues cv = new ContentValues();
cv.put(COLUMN_RATIO, "0,0");
cv.put(COLUMN_TXT, "");
cv.put(COLUMN_IMG, R.drawable.man);
db.insert(DB_TABLE, null, cv);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
}
Re: Урок 52. SimpleCursorAdapter, пример использования
public static final String COLUMN_RATIO = "rto";
вот такая у тебя колонка есть, а той, что там написано - нету.
вот такая у тебя колонка есть, а той, что там написано - нету.
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: Урок 52. SimpleCursorAdapter, пример использования
Да эт переименовал просто, а проблема была в этих строчкахFoenix писал(а):public static final String COLUMN_RATIO = "rto";
вот такая у тебя колонка есть, а той, что там написано - нету.
Код: Выделить всё
String[] from = new String[] { DB.COLUMN_IMG, DB.COLUMN_TXT, DB.COLUMN_RATIO };
int[] to = new int[] { R.id.ivImg, R.id.tvText, R.id.tvRatio };
Re: Урок 52. SimpleCursorAdapter, пример использования
Cделал как в уроке 136, подчёркивает красным getSupportLoaderManager
Хелп, плз.
стр. 92, 102, 119
Пишет - Cannot make a static reference to the non-static method getSupportLoaderManager() from the type FragmentActivity
MainActivity.java
[syntax=java]package com.example.p0521_simplecursoradapter;
import java.util.concurrent.TimeUnit;
import android.content.Context;
import android.content.CursorLoader;
import android.content.Loader;
import android.database.Cursor;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v7.app.ActionBarActivity;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.add(R.id.container, new PlaceholderFragment()).commit();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
/**
* A placeholder fragment containing a simple view.
*/
public static class PlaceholderFragment extends Fragment {
public PlaceholderFragment() {
}
private static final int CM_DELETE_ID = 1;
ListView lvData;
DB db;
SimpleCursorAdapter scAdapter;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main, container,
false);
// открываем подключение к БД
db = new DB(getActivity());
db.open();
// формируем столбцы сопоставления
String[] from = new String[] { DB.COLUMN_IMG, DB.COLUMN_TXT };
int[] to = new int[] { R.id.ivImg, R.id.tvText };
// создааем адаптер и настраиваем список
scAdapter = new SimpleCursorAdapter(getActivity(), R.layout.item, null, from, to, 0);
lvData = (ListView) rootView.findViewById(R.id.lvData);
lvData.setAdapter(scAdapter);
// добавляем контекстное меню к списку
registerForContextMenu(lvData);
// создаем лоадер для чтения данных
getSupportLoaderManager().initLoader(0, null, getActivity());
return rootView;
}
// обработка нажатия кнопки
public void onButtonClick(View view) {
// добавляем запись
db.addRec("sometext " + (scAdapter.getCount() + 1), R.drawable.ic_launcher);
// получаем новый курсор с данными
getSupportLoaderManager().getLoader(0).forceLoad();
}
public void onCreateContextMenu(ContextMenu menu, View v,
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) {
// получаем из пункта контекстного меню данные по пункту списка
AdapterContextMenuInfo acmi = (AdapterContextMenuInfo) item
.getMenuInfo();
// извлекаем id записи и удаляем соответствующую запись в БД
db.delRec(acmi.id);
// получаем новый курсор с данными
getSupportLoaderManager().getLoader(0).forceLoad();
return true;
}
return super.onContextItemSelected(item);
}
public void onDestroy() {
super.onDestroy();
// закрываем подключение при выходе
db.close();
}
public Loader<Cursor> onCreateLoader(int id, Bundle bndl) {
return new MyCursorLoader(getActivity(), db);
}
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
scAdapter.swapCursor(cursor);
}
public void onLoaderReset(Loader<Cursor> loader) {
}
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;
}
}
}
}
[/syntax]
Хелп, плз.
стр. 92, 102, 119
Пишет - Cannot make a static reference to the non-static method getSupportLoaderManager() from the type FragmentActivity
MainActivity.java
[syntax=java]package com.example.p0521_simplecursoradapter;
import java.util.concurrent.TimeUnit;
import android.content.Context;
import android.content.CursorLoader;
import android.content.Loader;
import android.database.Cursor;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v7.app.ActionBarActivity;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.add(R.id.container, new PlaceholderFragment()).commit();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
/**
* A placeholder fragment containing a simple view.
*/
public static class PlaceholderFragment extends Fragment {
public PlaceholderFragment() {
}
private static final int CM_DELETE_ID = 1;
ListView lvData;
DB db;
SimpleCursorAdapter scAdapter;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main, container,
false);
// открываем подключение к БД
db = new DB(getActivity());
db.open();
// формируем столбцы сопоставления
String[] from = new String[] { DB.COLUMN_IMG, DB.COLUMN_TXT };
int[] to = new int[] { R.id.ivImg, R.id.tvText };
// создааем адаптер и настраиваем список
scAdapter = new SimpleCursorAdapter(getActivity(), R.layout.item, null, from, to, 0);
lvData = (ListView) rootView.findViewById(R.id.lvData);
lvData.setAdapter(scAdapter);
// добавляем контекстное меню к списку
registerForContextMenu(lvData);
// создаем лоадер для чтения данных
getSupportLoaderManager().initLoader(0, null, getActivity());
return rootView;
}
// обработка нажатия кнопки
public void onButtonClick(View view) {
// добавляем запись
db.addRec("sometext " + (scAdapter.getCount() + 1), R.drawable.ic_launcher);
// получаем новый курсор с данными
getSupportLoaderManager().getLoader(0).forceLoad();
}
public void onCreateContextMenu(ContextMenu menu, View v,
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) {
// получаем из пункта контекстного меню данные по пункту списка
AdapterContextMenuInfo acmi = (AdapterContextMenuInfo) item
.getMenuInfo();
// извлекаем id записи и удаляем соответствующую запись в БД
db.delRec(acmi.id);
// получаем новый курсор с данными
getSupportLoaderManager().getLoader(0).forceLoad();
return true;
}
return super.onContextItemSelected(item);
}
public void onDestroy() {
super.onDestroy();
// закрываем подключение при выходе
db.close();
}
public Loader<Cursor> onCreateLoader(int id, Bundle bndl) {
return new MyCursorLoader(getActivity(), db);
}
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
scAdapter.swapCursor(cursor);
}
public void onLoaderReset(Loader<Cursor> loader) {
}
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;
}
}
}
}
[/syntax]
Тут должна быть подпись.
Re: Урок 52. SimpleCursorAdapter, пример использования
импорты - лоадер,курсор лоадер, фрагменты и прочее - если используешь сапопорт-либу то все должны быть оттуда, если нет - то все через обычную. НЕльзя смешивать две! ПРичем во всем приложении желательно это согласовать.
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: Урок 52. SimpleCursorAdapter, пример использования
Сделал по совету в предыдущем сообщении. Спасибо.
Приложение скомпилировалось, но при запуске выходит с ошибкой. Строка 98
Хелп, плз.
MainActivity.java
[syntax=java5]package com.example.p0521_simplecursoradapter;
import java.util.concurrent.TimeUnit;
import android.support.v4.app.Fragment;
import android.app.LoaderManager.LoaderCallbacks;
import android.content.Context;
import android.content.CursorLoader;
import android.content.Loader;
import android.database.Cursor;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.add(R.id.container, new PlaceholderFragment()).commit();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
/**
* A placeholder fragment containing a simple view.
*/
public static class PlaceholderFragment extends Fragment implements LoaderCallbacks<Cursor>{
public PlaceholderFragment() {
}
private static final int CM_DELETE_ID = 1;
ListView lvData;
DB db;
SimpleCursorAdapter scAdapter;
@SuppressWarnings("unchecked")
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main, container,
false);
// открываем подключение к БД
db = new DB(getActivity());
db.open();
// формируем столбцы сопоставления
String[] from = new String[] { DB.COLUMN_IMG, DB.COLUMN_TXT };
int[] to = new int[] { R.id.ivImg, R.id.tvText };
// создааем адаптер и настраиваем список
scAdapter = new SimpleCursorAdapter(getActivity(), R.layout.item, null, from, to, 0);
lvData = (ListView) rootView.findViewById(R.id.lvData);
lvData.setAdapter(scAdapter);
// добавляем контекстное меню к списку
registerForContextMenu(lvData);
// создаем лоадер для чтения данных
getActivity().getLoaderManager().initLoader(0, null, (LoaderCallbacks<DB>) getActivity());
return rootView;
} // конец OnCreate
// обработка нажатия кнопки
public void onButtonClick(View view) {
// добавляем запись
db.addRec("sometext " + (scAdapter.getCount() + 1), R.drawable.ic_launcher);
// получаем новый курсор с данными
getActivity().getLoaderManager().getLoader(0).forceLoad();
}
public void onCreateContextMenu(ContextMenu menu, View v,
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) {
// получаем из пункта контекстного меню данные по пункту списка
AdapterContextMenuInfo acmi = (AdapterContextMenuInfo) item
.getMenuInfo();
// извлекаем id записи и удаляем соответствующую запись в БД
db.delRec(acmi.id);
// получаем новый курсор с данными
getActivity().getLoaderManager().getLoader(0).forceLoad();
return true;
}
return super.onContextItemSelected(item);
}
public void onDestroy() {
super.onDestroy();
// закрываем подключение при выходе
db.close();
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle bndl) {
return new MyCursorLoader(getActivity(), db);
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
scAdapter.swapCursor(cursor);
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
}
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;
}
}
}
}
[/syntax]
Приложение скомпилировалось, но при запуске выходит с ошибкой. Строка 98
Хелп, плз.
Код: Выделить всё
04-28 10:31:08.110: E/AndroidRuntime(996): Caused by: java.lang.ClassCastException: com.example.p0521_simplecursoradapter.MainActivity cannot be cast to android.app.LoaderManager$LoaderCallbacks
04-28 10:31:08.110: E/AndroidRuntime(996): at com.example.p0521_simplecursoradapter.MainActivity$PlaceholderFragment.onCreateView(MainActivity.java:98)
[syntax=java5]package com.example.p0521_simplecursoradapter;
import java.util.concurrent.TimeUnit;
import android.support.v4.app.Fragment;
import android.app.LoaderManager.LoaderCallbacks;
import android.content.Context;
import android.content.CursorLoader;
import android.content.Loader;
import android.database.Cursor;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.add(R.id.container, new PlaceholderFragment()).commit();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
/**
* A placeholder fragment containing a simple view.
*/
public static class PlaceholderFragment extends Fragment implements LoaderCallbacks<Cursor>{
public PlaceholderFragment() {
}
private static final int CM_DELETE_ID = 1;
ListView lvData;
DB db;
SimpleCursorAdapter scAdapter;
@SuppressWarnings("unchecked")
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main, container,
false);
// открываем подключение к БД
db = new DB(getActivity());
db.open();
// формируем столбцы сопоставления
String[] from = new String[] { DB.COLUMN_IMG, DB.COLUMN_TXT };
int[] to = new int[] { R.id.ivImg, R.id.tvText };
// создааем адаптер и настраиваем список
scAdapter = new SimpleCursorAdapter(getActivity(), R.layout.item, null, from, to, 0);
lvData = (ListView) rootView.findViewById(R.id.lvData);
lvData.setAdapter(scAdapter);
// добавляем контекстное меню к списку
registerForContextMenu(lvData);
// создаем лоадер для чтения данных
getActivity().getLoaderManager().initLoader(0, null, (LoaderCallbacks<DB>) getActivity());
return rootView;
} // конец OnCreate
// обработка нажатия кнопки
public void onButtonClick(View view) {
// добавляем запись
db.addRec("sometext " + (scAdapter.getCount() + 1), R.drawable.ic_launcher);
// получаем новый курсор с данными
getActivity().getLoaderManager().getLoader(0).forceLoad();
}
public void onCreateContextMenu(ContextMenu menu, View v,
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) {
// получаем из пункта контекстного меню данные по пункту списка
AdapterContextMenuInfo acmi = (AdapterContextMenuInfo) item
.getMenuInfo();
// извлекаем id записи и удаляем соответствующую запись в БД
db.delRec(acmi.id);
// получаем новый курсор с данными
getActivity().getLoaderManager().getLoader(0).forceLoad();
return true;
}
return super.onContextItemSelected(item);
}
public void onDestroy() {
super.onDestroy();
// закрываем подключение при выходе
db.close();
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle bndl) {
return new MyCursorLoader(getActivity(), db);
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
scAdapter.swapCursor(cursor);
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
}
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;
}
}
}
}
[/syntax]
Тут должна быть подпись.
Re: Урок 52. SimpleCursorAdapter, пример использования
опять - иморты, импорты не те
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: Урок 52. SimpleCursorAdapter, пример использования
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: Урок 52. SimpleCursorAdapter, пример использования
интерфейс лоадера нужно реализовать. Все есть в уроках.
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