Урок 52. SimpleCursorAdapter, пример использования

Обсуждение уроков
AlexVinn
Сообщения: 81
Зарегистрирован: 04 апр 2014, 04:56

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение AlexVinn » 28 апр 2014, 19:03

В уроке же все работает. Код с урока, только в фрагмент вставил. Тут что-то с фрагментом скорее всего не то или с импортом. Весь проект в коде. Помогите, пожалуйста. Заранее благодарности.
MainActivity.java
[syntax=java5]package com.example.p0521_simplecursoradapter;

import java.util.concurrent.TimeUnit;

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.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 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]
DB.java
[syntax=java5]package com.example.p0521_simplecursoradapter;

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";

private static final String DB_CREATE =
"create table " + DB_TABLE + "(" +
COLUMN_ID + " integer primary key autoincrement, " +
COLUMN_IMG + " integer, " +
COLUMN_TXT + " 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, int img) {
ContentValues cv = new ContentValues();
cv.put(COLUMN_TXT, txt);
cv.put(COLUMN_IMG, img);
mDB.insert(DB_TABLE, null, cv);
}

// удалить запись из DB_TABLE
public void delRec(long id) {
mDB.delete(DB_TABLE, 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();
for (int i = 1; i < 5; i++) {
cv.put(COLUMN_TXT, "sometext " + i);
cv.put(COLUMN_IMG, R.drawable.ic_launcher);
db.insert(DB_TABLE, null, cv);
}
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
}[/syntax]
activity_main.xml
[syntax=xml]<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.p0521_simplecursoradapter.MainActivity"
tools:ignore="MergeRootFrame" />
[/syntax]
fragment_main.xml
[syntax=xml]<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onButtonClick"
android:text="@string/add_record">
</Button>
<ListView
android:id="@+id/lvData"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</ListView>
</LinearLayout>[/syntax]
item.xml
[syntax=xml]<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<ImageView
android:id="@+id/ivImg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_launcher">
</ImageView>
<TextView
android:id="@+id/tvText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginLeft="10dp"
android:text=""
android:textSize="18sp">
</TextView>
</LinearLayout>
[/syntax]
strings.xml
[syntax=xml]<?xml version="1.0" encoding="utf-8"?>
<resources>

<string name="app_name">P0521_SimpleCursorAdapter</string>
<string name="hello_world">Hello world!</string>
<string name="action_settings">Settings</string>
<string name="add_record">Добавить запись</string>
<string name="delete_record">Удалить запись</string>

</resources>
[/syntax]
Тут должна быть подпись.

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

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение Foenix » 28 апр 2014, 19:10

ты что, издеваешься? Я сказала что делать
R.id.team

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

AlexVinn
Сообщения: 81
Зарегистрирован: 04 апр 2014, 04:56

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение AlexVinn » 28 апр 2014, 20:30

Импорты поменял к саппорт либам, всё определил.
Вылетает при запуске (, я в шоке (

04-28 13:20:41.637: E/AndroidRuntime(1409): Caused by: java.lang.ClassCastException: com.example.p0521_simplecursoradapter.MainActivity cannot be cast to android.app.LoaderManager$LoaderCallbacks
04-28 13:20:41.637: E/AndroidRuntime(1409): at com.example.p0521_simplecursoradapter.MainActivity$PlaceholderFragment.onCreateView(MainActivity.java:97)

[syntax=java5]package com.example.p0521_simplecursoradapter;

import java.util.concurrent.TimeUnit;

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.support.v4.widget.SimpleCursorAdapter;
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;



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, (android.app.LoaderManager.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 MyCursorLoader onCreateLoader(int id, Bundle bndl) {
return new MyCursorLoader(getActivity(), db);
}

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;
}
}

public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
scAdapter.swapCursor(cursor);
}

@Override
public void onLoaderReset(android.support.v4.content.Loader<Cursor> arg0) {
// TODO Auto-generated method stub
}


}
}
[/syntax]
DB.java
[syntax=java5]package com.example.p0521_simplecursoradapter;

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";

private static final String DB_CREATE =
"create table " + DB_TABLE + "(" +
COLUMN_ID + " integer primary key autoincrement, " +
COLUMN_IMG + " integer, " +
COLUMN_TXT + " 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, int img) {
ContentValues cv = new ContentValues();
cv.put(COLUMN_TXT, txt);
cv.put(COLUMN_IMG, img);
mDB.insert(DB_TABLE, null, cv);
}

// удалить запись из DB_TABLE
public void delRec(long id) {
mDB.delete(DB_TABLE, 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();
for (int i = 1; i < 5; i++) {
cv.put(COLUMN_TXT, "sometext " + i);
cv.put(COLUMN_IMG, R.drawable.ic_launcher);
db.insert(DB_TABLE, null, cv);
}
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
}[/syntax]
Тут должна быть подпись.

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

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение Foenix » 28 апр 2014, 21:23

все нет времени смореть. Ну ты внимательнее просто разберись
вот у тебя
getActivity().getLoaderManager().initLoader(0, null, (android.app.LoaderManager.LoaderCallbacks<DB>) getActivity());
ты сам посмотри - ты вызваешь активность и ее initloader. но ведь интерфейс у тебя реализован во фрагменте!
PlaceholderFragment extends Fragment implements LoaderCallbacks
вот и ошибка.
R.id.team

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

AlexVinn
Сообщения: 81
Зарегистрирован: 04 апр 2014, 04:56

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение AlexVinn » 28 апр 2014, 22:45

Поверить не могу, но оно работает !!!
Спасибо огромное.
Тут должна быть подпись.

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

Re: Урок 52. SimpleCursorAdapter, пример использования

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

AlexVinn писал(а):Поверить не могу, но оно работает !!!
Спасибо огромное.
сколько не пишу - когда получается всегда точно такие же ощущения))
R.id.team

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

Irrumator
Сообщения: 25
Зарегистрирован: 08 окт 2014, 16:39

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение Irrumator » 14 окт 2014, 17:15

Господа, не могу понять в чем проблема!
Взял код урока, для наглядности.Задача - при создании пункта списка отредактировать содержимое textView.
Для этого строку кода
db.addRec("sometext " + (cursor.getCount() + 1), R.drawable.ic_launcher);
где мы автоматически присваиваем имя пункту, заменил на строку
db.addRec(editText1.getText().toString(), R.drawable.ic_launcher);
Ну и соответственно добавил EditText в main.xml.
Надеялся, что при нажатии кнопки, обработчик присвоит для textView содержимое поля editText.
На деле же приложение валится при нажатии кнопки и в логах ссылка на как раз эту строку.

Объясните, почему нельхя подавать на вход EditText ?

Зараннее благодарен.

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

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение Foenix » 14 окт 2014, 17:41

никто не будет специально лезть в урок и сравнивать там строки
приводите код и т.д.
R.id.team

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

Irrumator
Сообщения: 25
Зарегистрирован: 08 окт 2014, 16:39

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение Irrumator » 14 окт 2014, 17:42

Ошибку нашел, спасибо за отзывчивость =)

Irrumator
Сообщения: 25
Зарегистрирован: 08 окт 2014, 16:39

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение Irrumator » 14 окт 2014, 18:31

Другой вопрос: каким образом добавлять новые элементы списка вверх списка, а не вниз?
Есть какая либо инверсия ListView?

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

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение Foenix » 14 окт 2014, 19:04

работать надо с данными, а не со списком, который просто ПОКАЗЫВАЕТ то, что ему подал адаптер.
Поэтому чтоб показать другую сортировку - нужно в курсор выбрать данные по-другому рассортированные, например, по дате обновления. А для этого держать в таблице поле с данной датой.
R.id.team

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

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

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение Foenix » 14 окт 2014, 19:04

кроме того - добавляем мы данные не в список, а в таблицы.
R.id.team

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

Irrumator
Сообщения: 25
Зарегистрирован: 08 окт 2014, 16:39

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение Irrumator » 18 окт 2014, 11:50

Хорошо, спасибо за идею с колонкой даты!

Такой вопрос: а почему нельзя сделать сортировку по возрастанию ID? Ведь каждая новая запись в таблицу имеет больший ID, чем предыдущая, даже если удалять первоначальные записи.

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

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение Foenix » 18 окт 2014, 12:13

что значит нельзя?
R.id.team

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

Irrumator
Сообщения: 25
Зарегистрирован: 08 окт 2014, 16:39

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение Irrumator » 18 окт 2014, 16:07

Ну почему то же ведь Вы посоветовали создать колонку с датой создания элемента, а не использовать колонку ИД для отображения элементов в списке в порядке убывания)
Я и подумал, что колонку ИД не надо использовать для этих целей...

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

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение Foenix » 18 окт 2014, 18:43

я уже просто не помню о чем шла речь, если честно. А причем тут дата и ID? и что значит нельзя сделать сортировку? что значит нельзя? есть предложение order by для этих целей.
R.id.team

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

Irrumator
Сообщения: 25
Зарегистрирован: 08 окт 2014, 16:39

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение Irrumator » 18 окт 2014, 20:45

Ну что Вы в самом деле?
Я же самым первым вопросом спросил, каким образом добавлять новые элементы списка вверх списка, а не вниз, как это выходит по умолчанию?

На что Вы мне ответили: чтоб показать другую сортировку - нужно в курсор выбрать данные по-другому рассортированные, например, по дате обновления. А для этого держать в таблице поле с данной датой.

т.е., Вы не сказали использовать в качестве фильтра для сортировки полеБД ID, а порекомендовали создать новое поле с датой создания. Я и подумал, что на это есть веские причины, и спросил у Вас).

То есть можно было не создавать колонку с датой, а выполнить сортировку по ИД? ничего страшного?
А то с колонкой даты возникает небольшая проблема: насколько я знаю, при использовании SimpleDateFormat для получения текущего времени, невозможно указать меньший период времени чем 1 секунда. А следовательно, при создании нескольких элементов БД в одну и ту же секунду, они будут все равно отсортированы не так, как нужно.
Пришлось выставить секундную задержку, перед обновлением курсора =/

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

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение Foenix » 19 окт 2014, 03:21

ты, конечно, извини, но когда мало времени и полно разной другой работы, то в голове просто не хочется держать какие-то чужие вопросы, на которые ты отвечал неделю назад, это просто невозможно. Так что спасибо что напомнил, так легче ответить.
Отвечаю.
Сортировку по ИД делать в данном случае нельзя, т.к. нет никакой гарантии что она будет совпадать с сортировкой по времени - это раз.
Во-вторых, время добавления вставляй в таблицу при помощи функции System.currentTimeMillis() - это время с точностью до миллисекунд. И убери задержку, такие штуки никогда нельзя длать в программах, языки программирования составляли умные люди и они МНОГО чего предусмотрели, чего ты возможно не знаешь, поэтому нужно не делать велосипеды, а искать эти вещи.
R.id.team

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

dimitrius
Сообщения: 17
Зарегистрирован: 21 авг 2014, 12:47

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение dimitrius » 01 ноя 2014, 11:24

Подскажите пожалуйста как мне посредством вызова контекстного меню из соответствующего пункта списка извлечь текст (к примеру из View R.id.tvText, куда записывается COLUMN_TXT) для

последующего его использования. Чтобы задача выглядела не бессмысленно скажу вам что у меня в списке есть email'ы и телефонные номера, поэтому извлечение подобной информации будет

полезной опцией, буду вам очень признателен за помощь)

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

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение Foenix » 01 ноя 2014, 12:17

1) отдели у себя в голове данные от адаптера и их представления. Извлекать текст нужно не из пункта списка, а из данных, откуда этот список данные взял. Его дело только показать!
2) контекстное меню устарело. Делай режим контекстных действий в ActionBar.
R.id.team

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

Ответить