我有两个加载器,一个用于将返回的数据填充到 2 个 TextViews
,另一个用于填充一个 ListView
。我如何确保为每种情况加载正确的加载程序?我在 where first loader (WR_VIEW
case) 似乎没有创建或加载时遇到错误,所以在 onLoadFinished()
中它返回“没有这样的列发现错误”,因为它正在访问不调用该列的第二个加载程序。
在我的 onCreate
方法中,我为 ListView 设置了适配器:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.workouts_options);
String[] uiBindFrom = { ExerciseTable.COLUMN_NAME };
int[] uiBindTo = { R.id.text1 };
SimpleCursorAdapter adapter = new SimpleCursorAdapter(
getApplicationContext(),
R.layout.exercises_row,
null,
uiBindFrom,
uiBindTo,
CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
final ListView lv = (ListView) findViewById(android.R.id.list);
lv.setAdapter(adapter);
lv.setEmptyView(findViewById(android.R.id.empty));
lv.setClickable(true);
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position, long id) {
}
});
getSupportLoaderManager().initLoader(WR_VIEW, null, this);
getSupportLoaderManager().initLoader(EXERCISE_VIEW, null, this);
}
创建我的 2 个不同的 CursorLoader
:
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
switch(id) {
case WR_VIEW:
String[] projection = { WorkoutRoutineTable.COLUMN_ID, WorkoutRoutineTable.COLUMN_NAME, WorkoutRoutineTable.COLUMN_DESCRIPTION };
return new CursorLoader(this, Workouts.buildWorkoutIdUri(""+mRowId), projection, null, null, null);
default:
String[] columns = {ExercisesColumns.NAME, WRExercisesColumns.COLUMN_ID };
return new CursorLoader(this, Workouts.buildWorkoutIdExerciseUri(""+mRowId), columns, null, null, null);
}
}
在此处将数据绑定(bind)到我的 TextViews
和 ListView
的 swapCursor
:
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
int id = loader.getId();
switch(id) {
case WR_VIEW:
if (cursor != null && cursor.moveToFirst()) {
mNameText.setText(cursor.getString(cursor.getColumnIndexOrThrow(WorkoutRoutineTable.COLUMN_NAME)));
mDescriptionText.setText(cursor.getString(cursor.getColumnIndexOrThrow(WorkoutRoutineTable.COLUMN_DESCRIPTION)));
getSupportActionBar().setTitle(mNameText.getText());
if (!TextUtils.isEmpty(mDescriptionText.getText())) {
getSupportActionBar().setSubtitle(mDescriptionText.getText());
}
cursor.close();
}
default:
adapter.swapCursor(cursor);
}
}
重置加载程序:
public void onLoaderReset(Loader<Cursor> loader) {
int id = loader.getId();
switch(id) {
case WR_VIEW:
break;
default:
adapter.swapCursor(null);
break;
}
}
最佳答案
在您的 onLoadFinished()
中,您在 WR_VIEW 情况下没有 break
,因此 default 子句也在运行,将错误的光标传递给您的适配器. (onCreateLoader 似乎也有类似的问题)
关于android - 带有 LoaderManager 的多个 Loader,没有得到正确的 Loader,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11463299/