更改ListActivity的托管游标的正确方法是什么

时间:2011-02-28 01:59:40

标签: android cursor listactivity

我有一个ListActivity,我想要一个微调器允许用户选择ListView应该实际显示的内容。

在onCreate方法中,我实例化我的第一个游标并调用startManagingCursor()。我还设置了一个自定义CursorAdapter来负责渲染视图。

我想知道的是当用户选择过滤器微调器中的项目时更改光标的正确方法。

我正在做的是将一个OnItemSelectedListener添加到微调器,并在onItemSelected()方法内部创建一个新的Cursor然后新的CursorAdapter然后调用

stopManagingCursor(currentCursor); currentCursor = newCursor; startManagingCursor(currentCursor); setListAdapter(newAdapter);

这是一种合适的方法吗? 我该怎么办? 我忘记了什么吗? 这难看吗?

以下是一些代码:

public class MyListActivity extends ListActivity {


private Spinner typeFilterSpinner;

private MyListAdapter cursorAdapter;

private Cursor currentCursor;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);

    setContentView(R.layout.my_layout);

    typeFilterSpinner = (Spinner) findViewById(R.id.TypeFilterSpinner);

    typeFilterSpinner.setOnItemSelectedListener(new SpinnerItemSelectedListener());

    currentCursor = MyDAO.getInstance().getMyCursor(null);
    startManagingCursor(currentCursor);

    cursorAdapter = new SelectionListAdapter(this, currentCursor);
    setListAdapter(cursorAdapter);
}

class SelectionListAdapter extends CursorAdapter {

     public FavouriteLocationSelectionListAdapter(Context context, Cursor cursor){
        super(context, cursor, true);

        [....] other initialization stuff here
    }
    [....] overriden rendering methods here
}   

public class SpinnerItemSelectedListener implements OnItemSelectedListener {

    public void onItemSelected(AdapterView<?> parent,View view, int pos, long id) {

        Long mi = spinnerItems.get(pos);
        Cursor newCursor = MyDAO.getInstance().getMyCursor(mi);

        //TODO maybe call setCursor on the adapter here instead of instanciating a new cursor

        SelectionListAdapter newAdapter = 
            new SelectionListAdapter(MyListActivity.this, newCursor);

        stopManagingCursor(currentCursor);
        currentCursor = newCursor;
        startManagingCursor(currentCursor);
        setListAdapter(newAdapter);

    }

    public void onNothingSelected(AdapterView parent) {
      // woooork ?
    }
}   

}

这个想法。

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

stopManagingCursor没有关闭Cursor,所以当你切换它们时你会想要这样做。正如您在代码中指出的那样,最好保留相同的适配器,并为其提供新的游标。作为奖励,致电CursorAdapter.changeCursor(Cursor)将为您关闭旧Cursor