我在我的应用程序中有一种奇怪的行为,我很难理解。 我有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);
}
答案 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);
} //如果是,则结束 } //结束方法