标签: android-cursorloader

Android CursorLoader与AsyncQueryHandler?

我已经看到了如何实现CursorLoader和AsyncQueryHandler.如果我想将它用于SimpleCursorTreeAdapter的Android 2.2应用程序,我应该使用哪一个?

android android-cursorloader

7
推荐指数
1
解决办法
1477
查看次数

使用支持库时LoaderManager出错

我正在尝试将我的代码从使用游标转换为使用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)

android android-loadermanager android-cursorloader

7
推荐指数
1
解决办法
1万
查看次数

使用CursorLoader查询专辑的歌曲

我想通过查询获得的一张专辑的歌曲列表MediaStoreCursorLoader

我怎样才能做到这一点 ?我可以使用以下代码获取设备的所有歌曲:

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)

我应该添加什么代码或修改来过滤特定专辑的歌曲?

android android-cursor android-cursorloader

6
推荐指数
1
解决办法
8560
查看次数

IllegalStateException - 使用AutocompleteTextView支持LoaderManager

我想到使用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

6
推荐指数
1
解决办法
2728
查看次数

处理CursorLoader异常

我有一个Fragment实现LoaderManager并使用CursorLoader(没什么特别的).我想捕获查询期间抛出的异常,但我不知道如何!有帮助吗?谢谢.

android exception-handling android-loadermanager android-cursorloader

6
推荐指数
1
解决办法
1483
查看次数

使用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)

android android-cursorloader android-loader

6
推荐指数
1
解决办法
8514
查看次数

基础数据更改时Cursorloader不刷新

我有一个内容提供者,一个内容解析器和一个游标加载器.加载器用于间接填充listview(即不是简单的游标适配器,而是数组适配器,因为我需要使用游标的结果来收集其他数据).

当我更改基础数据时,listview不会重新填充,因为未onLoadFinished(Loader<Cursor>, Cursor)调用回调.

正如我在写这篇文章时所建议的那样,在这个问题上存在很多问题.例如, CursorLoader在数据更改后未更新

所有问题都指出了两件事:

  • 在内容提供程序query()方法中,您需要告诉光标有关通知a'la

c.setNotificationUri(getContext().getContentResolver(), uri);

  • 在内容提供者插入/更新/删除方法中,您需要通知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)

android android-cursorloader

6
推荐指数
1
解决办法
6104
查看次数

排序顺序不适用于listView和游标加载器

我有一个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

6
推荐指数
1
解决办法
2808
查看次数

在动画制作之前,滑动以删除卡片视图会导致短暂闪烁

我已经在我的应用程序中实现了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

6
推荐指数
1
解决办法
844
查看次数

如何使用CursorLoader实现类似whatsApp,Messenger聊天页面(反向滚动以加载更多内容)的分页?

我的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

6
推荐指数
0
解决办法
974
查看次数