游标加载器过滤,旧数据显示为瞬间

时间:2015-08-07 19:57:14

标签: android listview user-experience android-cursoradapter android-cursorloader

我在我的应用程序中有一种奇怪的行为,我很难理解。 我有2个列表(A& B),初始视图是列表A,顶部有一个textBox,用于过滤列表B的结果。

我使用游标加载器,适配器和listview来实现这两个列表。

当用户输入要搜索的关键字时,我使用输入的关键字重新启动Loader B并将其加载到适配器中并将listview设置为显示适配器B.

一切运行正常而不是立即显示结果,会发生错误行为:完整列表B会显示一瞬间,然后显示过滤后的结果。 当然这会创建一个非常糟糕的用户体验(用户体验),我想在这里实现的是过滤后的结果立即显示而没有完整列表B的拆分第二视图。

我真的想了解为什么会发生这种行为...毕竟这种查询的实现方式是游标加载器的官方示例中使用的方式:)

代码太大但这些是最相关的部分: 这是产生不良行为的onTextChange:

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) 
{ 
    getLoaderManager().restartLoader(LOADER_ID_2, null, this);
}

这些是cursorLoader方法:

public Loader<Cursor> onCreateLoader(int id, Bundle args) {
if (id== LOADER_ID_1)
    {
                //calculate and return cursorLoader
    }
  else
    {
           if (mFilter == null || mFilter.length() == 0) 
            {
                return new CursorLoader(this, uri, CAdapter.PROJECTION, null,null,null);
            }
//else
// do some calculations
return new CursorLoader(this,uri, CAdapter.PROJECTION, whereStmt, whereArgs, orderBy);
     }
}

public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
if (loader.getId()== LOADER_ID_2)
            {
                mCAdapter.swapCursor(cursor);
            }
        else if (loader.getId()== LOADER_ID_1)
            {
             MatrixCursor newCursor = new MatrixCursor(DAdapter.PROJECTION);             
             if (cursor.moveToFirst()) {
                 do {
// basically I'm grouping filtering the returned cursor and populating the new matrix cursor with the filtered data because I didn't find a better way to filter and group results (get distinct rows)
             }while (cursor.moveToNext());
             }
        mDAdapter.changeCursor(newCursor);
//I used change cursor because the cursor loader will only handle closing the "cursor" and not the "newCursor" I created and put into the adapter, I hope this doesn't backfire :)
}

    public void onLoaderReset(Loader<Cursor> loader) {
        if (loader.getId()== LOADER_ID_2 )
            mCAdapter.swapCursor(null);
        else if (loader.getId()== LOADER_ID_1 )
            mDAdapter.swapCursor(null);
    }

1 个答案:

答案 0 :(得分:0)

试试这个;

public Loader<Cursor> onCreateLoader(int id, Bundle args) 
{
Loader<Cursor> cursorLoader
if (id== LOADER_ID_1)
{
//calculate and return cursorLoader
If(cursorLoader == null)
{
return new CursorLoader(this,uri,

CAdapter.PROJECTION,whereStmt,whereArgs,orderBy);     } // end inner if

}// end if 
else if (mFilter == null || mFilter.length() == 0) 
{
return new CursorLoader(this, uri, CAdapter.PROJECTION, null,null,null);

} //如果是,则结束 } //结束方法