我已经看到了如何实现CursorLoader和AsyncQueryHandler.如果我想将它用于SimpleCursorTreeAdapter的Android 2.2应用程序,我应该使用哪一个?
我正在尝试将我的代码从使用游标转换为使用CursorLoaders.为了支持旧版本的Android,我安装了支持库,而不是导入android.content.CursorLoader,我正在导入android.support.v4.content.CursorLoader.现在编译好的代码会抛出两个错误.我实现它时,第一个错误是在LoaderManager上.错误是:LoaderManager无法解析为某种类型.第二个错误是对initLoader的调用.错误是:LoaderManager类型中的方法initLoader(int,Bundle,LoaderManager.LoaderCallbacks)不适用于参数(int,Bundle,MyList).这是我的代码:
public class MyList extends ListActivity implements LoaderManager.LoaderCallbacks<Cursor> {
private static final String[] PROJECTION = new String[] { "_id", "fieldname" };
private static final int LOADER_ID = 0;
private static final String MYTABLE_BASEPATH = "MyTable_tbl";
private static final String AUTHORITY = "SQLData";
public static final Uri MY_URI = Uri.parse("content://" + AUTHORITY + "/" + MYTABLE_BASEPATH);
private SimpleCursorAdapter mAdapter;
@SuppressWarnings("deprecation")
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent myData = getIntent();
Bundle info = myData.getExtras();
if (info != null){
Cursor c; …Run Code Online (Sandbox Code Playgroud) 我想通过查询获得的一张专辑的歌曲列表MediaStore与CursorLoader
我怎样才能做到这一点 ?我可以使用以下代码获取设备的所有歌曲:
static final String[] TRACK_SUMMARY_PROJECTION = { MediaStore.Audio.Media._ID, MediaStore.Audio.Media.TITLE};
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
String sortOrder = MediaStore.Audio.Media.TITLE + " ASC";
String select = null;
return new CursorLoader(getActivity(), MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
TRACK_SUMMARY_PROJECTION, select, null,
sortOrder);
}
Run Code Online (Sandbox Code Playgroud)
我应该添加什么代码或修改来过滤特定专辑的歌曲?
我想到使用CursorLoaders和Loadermanagers的一个好处是你不需要手动管理游标的生命周期.所以我使用loadermanager使用支持包将适配器绑定到AutoCompleteTextView.
它工作得很好,除了它随机抛出一个错误,说"IllegalStateException - 尝试重新打开已经关闭的对象".当然,如果我们使用装载程序管理器,那不应该发生吗?
这是代码:
package com.bhagwad.tennis;
import android.appwidget.AppWidgetManager;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
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.v4.widget.SimpleCursorAdapter.CursorToStringConverter;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AutoCompleteTextView;
import android.widget.Button;
import com.bhagwad.tennis.TennisSchedule.TennisScheduleColumns;
public class WidgetConfiguration extends FragmentActivity implements OnClickListener, LoaderCallbacks<Cursor> {
Button mSaveWidget;
AutoCompleteTextView mPlayerName;
int mAppWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID;
String mSelection ="";
SimpleCursorAdapter mAdapter;
public static String PREFS = "com.bhagwad.tennis.appwidget";
public static final String PREFS_PREFIX_KEY = "prefix_";
@Override
protected void onCreate(Bundle …Run Code Online (Sandbox Code Playgroud) android autocompletetextview android-loadermanager android-cursorloader
我有一个Fragment实现LoaderManager并使用CursorLoader(没什么特别的).我想捕获查询期间抛出的异常,但我不知道如何!有帮助吗?谢谢.
android exception-handling android-loadermanager android-cursorloader
在我的列表视图没有填充数据库数据时,有什么更好的方法来显示进度指示器?
我找到了一些如何使用assynctask执行此操作的示例,但在我的情况下,我使用Loader/ CursorLoader.
public class TestActivity extends SherlockFragmentActivity implements
LoaderCallbacks<Cursor> {
SimpleCursorAdapter mAdapter;
ListView mListView;
private static final String[] UI_BINDING_FROM = new String[] {
TestDBAdapter.KEY_NAME, TestDBAdapter.KEY_ICON };
private static final int[] UI_BINDING_TO = new int[] { R.id.text, R.id.icon };
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_Test);
mListView = (ListView) findViewById(R.id.listview);
mAdapter = new TestAdapter(getApplicationContext(),
R.layout.list_item_Test, null, UI_BINDING_FROM,
UI_BINDING_TO, 0);
mListView.setAdapter(mAdapter);
getSupportLoaderManager().initLoader(0, null, this);
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
Uri uri = ContentProviderTest.CONTENT_URI; …Run Code Online (Sandbox Code Playgroud) 我有一个内容提供者,一个内容解析器和一个游标加载器.加载器用于间接填充listview(即不是简单的游标适配器,而是数组适配器,因为我需要使用游标的结果来收集其他数据).
当我更改基础数据时,listview不会重新填充,因为未onLoadFinished(Loader<Cursor>, Cursor)调用回调.
正如我在写这篇文章时所建议的那样,在这个问题上存在很多问题.例如, CursorLoader在数据更改后未更新
所有问题都指出了两件事:
c.setNotificationUri(getContext().getContentResolver(), uri);
getContext().getContentResolver().notifyChange(uri, null);
我正在做那些事.
我也没有关闭任何我回来的游标.
请注意,我的内容提供商位于一个单独的应用中(将其视为内容提供商应用 - 没有启动器主要活动).com.example.provider APK,com.example.app通过content://com.example.provider/table URI等调用(在内容解析器中)内容解析器(dbhelper)存在于库项目中(com.example.appdb)活动链接.(这样,多个项目可以通过链接使用dbhelper,所有内容提供者都通过单个APK安装)
我已经在装载程序管理器中启用了调试,并且可以看到在数据更改后强制刷新的位置(即重新启动加载程序并且之前被标记为非活动状态),但没有任何内容自动发生 - 而是响应于我的力量刷新.
我的装载机没有被刷新的任何想法?
- 编辑 -
加载器创建:
Log.d(TAG, "onCreateLoader ID: " + loaderID);
// typically a switch on the loader ID, and then
return dbHelper.getfoo()
Run Code Online (Sandbox Code Playgroud)
getfoo()通过以下方式返回游标加载器:
return new CursorLoader(context, FOO_URI, foo_Fields, foo_query, foo_argArray, foo_sort );
Loader Finish获取光标并填充表格(并进行一些处理) - 没有什么花哨的.
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
Log.d(TAG, "onLoadFinished id: " + loader.getId());
// switch on loader ID .. …Run Code Online (Sandbox Code Playgroud) 我有一个listView,它由游标加载器中的游标填充,并使用内容提供程序.我想对listView进行排序,以便安排它例如最新的项目添加在listView的顶部.listView始终以相同的顺序出现,我无法更改此顺序.
我尝试使用排序顺序并更改它,无论它设置为什么,listView始终显示相同位置的项目.使用这样的排序顺序,
CursorLoader loader = new CursorLoader
(List.this, Database.CONTENT_URI, projection,
null, null, LocationsTable.TIME_STAMP + " ASC");
Run Code Online (Sandbox Code Playgroud)
我试图按TIME_STAMP之外的其他列进行排序,但结果始终相同.列表中项目的顺序永远不会改变.甚至将ASC更改为DESC也没有效果.
如何设置使用cursorAdapter填充的listView中显示的项目的顺序或位置?
listview类中的一些代码示例
来自onCreate方法
adapter = new ViewAdapter(this, null, 0);
// sets array adapter to listview
listViewOne.setAdapter(adapter);
getLoaderManager().initLoader(LOADER_ID_ONE, null, this);
Run Code Online (Sandbox Code Playgroud)
三种回调方法 LoaderCallbacks<Cursor>
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
String projection[] = new String[]{LocationsTable._ID,
LocationsTable.LATITUDE, LocationsTable.LONGITUDE,
LocationsTable.LAND_ADDRESS, LocationsTable.LAST_NAME,
LocationsTable.FIRST_NAME, LocationsTable.LOCATION_IMAGE,
LocationsTable.TIME_STAMP };
CursorLoader loader = new CursorLoader
(List.this, Database.CONTENT_URI, projection, null, null,
LocationsTable.TIME_STAMP + " ASC");
return loader;
} // onCreateLoader
@Override
public …Run Code Online (Sandbox Code Playgroud) android listview android-contentprovider android-cursorloader
我已经在我的应用程序中实现了cardview,并且功能向右滑动以删除.当我向右滑动卡片视图时,它会返回并返回十分之一秒,然后增益消失,导致闪烁.
我的代码对于滑动触摸侦听器是这样的.我正在更新内容解析器以及通知适配器.
SwipeableRecyclerViewTouchListener swipeTouchListener =
new SwipeableRecyclerViewTouchListener(recyclerView,
new SwipeableRecyclerViewTouchListener.SwipeListener() {
@Override
public boolean canSwipe(int position) {
return true;
}
@Override
public void onDismissedBySwipeRight(RecyclerView recyclerView, int[] reverseSortedPositions) {
for (int position : reverseSortedPositions) {
Post post = posts.get(position);
post.setIsDeleted(true);
getActivity().getContentResolver().update(PostsContract.PostEntry.buildUriForPost(posts.get(position).get_ID()), Utility.changePostToContentValue(post), "_id=" + post.get_ID(),null);
posts.remove(position);
adapter.notifyItemRemoved(position);
}
}
});
recyclerView.addOnItemTouchListener(swipeTouchListener);
Run Code Online (Sandbox Code Playgroud)
我的onLoadFinished看起来像这样
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
if(data!=null && data.getCount() != posts.size()){
posts.clear();
while (data.moveToNext()){
Post post = new Post(data);
posts.add(post);
adapter.notifyDataSetChanged();
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我提出突破点.它在处理器onDismissedSwipeByRight中工作正常,其中删除的卡片不可见.但是当谈到OnLoadFinished断点时,我看到删除的卡片回来然后在函数执行后自动关闭,即使帖子Arraylist的大小完全相同.
由于删除的卡片返回十分之一秒.这会导致闪烁.谁能告诉我哪里出错了?
android android-adapter android-cursorloader android-cardview
我的ChatActivity的OnCreateLoader和onLoadFinished是:
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
CursorLoader loader = new CursorLoader(this,
DataProvider.CONTENT_URI_MESSAGES,
new String[]{
DataProvider.KEY_ID,
DataProvider.KEY_PHONE_NUMBER,
DataProvider.KEY_USER,
DataProvider.KEY_FLAG,
DataProvider.KEY_DATE_TIME,
DataProvider.KEY_CONTENT
},
"phone_number=?", new String[]{phoneNo_other}, null);
return loader;
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
mChatListBuilderAdapter.swapCursor(data);
}Run Code Online (Sandbox Code Playgroud)
此代码对于整个chatList都适用。但是我需要第一次加载ex:20个项目,并且在顶部的每个反向滚动上都加载另外20个项目,就像WhatsApp一样显示在列表中。
是否可以使用如下所示的rawquery来实现此目的?使用以下方法,我得到了预期的数据,但是无法返回Loader<Cursor>类型数据,
public Loader<Cursor> loadInitialItems(String phone_number, int limit){ //// limit 100, 200` -- get 200 records beginning with row 101 //
SQLiteDatabase db = this.getWritableDatabase();
String queryToGetInitialData ="SELECT * FROM (SELECT * FROM "+MYDATABASE_TABLE+" WHERE "+KEY_PHONE_NUMBER+" = …Run Code Online (Sandbox Code Playgroud) pagination android listview android-contentprovider android-cursorloader