android - 带有 LoaderManager 的多个 Loader,没有得到正确的 Loader

标签 android android-loadermanager android-loader

我有两个加载器,一个用于将返回的数据填充到 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)到我的 TextViewsListViewswapCursor:

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/

相关文章:

java - CursorLoader 不刷新数据

android - 使用自定义 Loader 时,不会在 ViewPager fragment 上调用 ​​onResume()

android - 在不更新 ListView 的常规(支持) fragment 中使用 AsyncTaskLoader 更新适配器

android - openfire可以和mysql服务器合并吗

android - Retrofit返回错误307,在android中调用web服务

android - ViewPager 中的中心 fragment

android - 在 Activity Android 中实现 LoaderCallbacks

android - 如何使用 CursorLoader 进行多个串行数据库查询

android - LoaderManager 的作用域是什么?

android - 与汽车的蓝牙连接