0

我正在尝试使ContentProvider每条记录都包含一个问题和相应的答案。以及显示每个问题和答案的 TextView 的 Activity 以及这些 TextView 下方的“下一步”按钮。单击下一步按钮时,我希望显示下一个问题和答案。

我正在尝试使用 CursorLoader 和 LoaderManager,因为 CursorLoader 将它们的数据保存在onStop()and之间onStart(),并且我正在尝试了解CursorLoadersand LoaderManagers

我发现的例子都使用了setListAdapter(),但我不希望我的活动看起来像一个列表。我试图通过使用 aSimpleCursorAdapter和使用bindView()我的main.xml布局来解决这个问题。不确定这是否可行。

如果我有一个普通的 Cursor,我会使用moveToNext(),但对于一个新的查询,LoaderManager我似乎必须这样做。restartLoader()我认为创建一个新查询比简单地使用游标转到下一条记录要花费更多时间。特别是因为我必须知道当前或下一个记录的位置。

所以我的问题是:我可以使用CursorLoaderandLoaderManager来遍历数据库,逐条记录,而无需对下一条记录进行新的查询吗?还是真的只适用于 ListViews CursorLoadersLoaderManagers

到目前为止,这是我的代码,我意识到它并不多,但我已经阅读并重新阅读了关于 Loaders 和 LoadManagers 的 Android 页面。

 public class Main extends Activity implements LoaderManager.LoaderCallbacks<Cursor>{

SimpleCursorAdapter adapter;
String curFilter;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    this.adapter = new SimpleCursorAdapter(getApplicationContext(),
                                           R.layout.main,
                                           null,
                                           new String[]{},
                                           new int[]{R.id.questionText,R.id.answerText},
                                           0);
    LinearLayout mainLayout = (LinearLayout)findViewById(R.id.mainLayout);

    this.adapter.bindView(mainLayout, getApplicationContext(), null);

    this.getLoaderManager().initLoader(0,null, this);

    Button nextQuestionButton = (Button)this.findViewById(R.id.Nextbutton);

    nextQuestionButton.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick (View v) {
        }               
    });
}
4

1 回答 1

0

我知道我的问题很模糊,我真的迷路了。几个月后,这是我的回答,希望它对我过去职位的人有所帮助。

当我调用 getLoaderManager().initLoader() 或内容提供者发生更改时(内容提供者必须调用 getContentResolver().notifyChange() 才能使其工作),会自动调用 onCreateLoader()。我提供了在覆盖方法 LoaderManager.LoaderCallbacks.onCreateLoader() 时制作光标加载器的代码。光标加载器会自动交给 onLoadFinished()。就是这样,我不再触摸光标加载器。自动调用的 onLoadFinished() 接收一个游标(由游标加载器生成)作为参数。我使用游标参数 this.adapter.setCursor(cursor) 在我的 onLoadFinished() 覆盖中更新了适配器。

SimpleCursorAdapter 没有 moveToNext 或 moveToPrevious,所以我做了一个 SteppedAdapter,见下图:

public class SteppedAdapter {
    private Cursor cursor = null;
    // This class uses a reference which may be changed
    // by the calling class.
    public SteppedAdapter (Cursor cursor) {
    this.cursor = cursor;
    }

    private int getColumnIndexOrThrow (String columnName) {
    return cursor.getColumnIndexOrThrow(columnName);
    }   

    public void moveToNext () {     
    if (null != cursor && !cursor.isClosed()) {
        if (cursor.isLast()) {
            cursor.moveToFirst();
        }
        else {
            cursor.moveToNext();
        }
    }   
    }

    public void moveToPrevious () {
    if (null != cursor && !cursor.isClosed()) {
        if (cursor.isFirst()) {
            cursor.moveToLast();
        }
        else {
            cursor.moveToPrevious();
        }
    }
    }

    public String getCurrentTarget (String targetColumn) throws EmptyCursorException {
    int idx = cursor.getColumnIndex(targetColumn);  
    String value = null;
    try {
        value = cursor.getString(idx);  
    }
    catch (CursorIndexOutOfBoundsException e){
        if ( 0 == cursor.getCount()) {
            throw new EmptyCursorException("Cursor is empty: "+e.getMessage()); 
        }
        else {
            throw e;
        }
    }
    return value;
    }   

    public void setCursor (Cursor cursor) {
    this.cursor = cursor;
    }

    public void setCursorToNull () {
    this.cursor = null; 
    }

    public int getPosition () {
    return this.cursor.getPosition();
    }

    public boolean cursorIsClosed () {
    return this.cursor.isClosed();
    }   

    public int getCount () {
    return cursor.getCount();
    }
} // end

由于适配器在 onLoadFinished() 中使用方法 adapter.setCursor(Cursor) 设置,并在 onLoaderReset() 中使用方法 adapter.setCursorToNull() 清除。那么适配器必须有这些方法。

于 2012-08-03T21:21:35.087 回答