Как правильно изменить управляемый курсор ListActivity? - PullRequest
1 голос
/ 28 февраля 2011

У меня есть 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 Ответ

2 голосов
/ 28 февраля 2011

stopManagingCursor не закрывает Cursor, поэтому вы захотите сделать это при переключении их. Как вы указали в своем коде, лучше оставить тот же адаптер и присвоить ему новый курсор. И в качестве бонуса, звонок CursorAdapter.changeCursor(Cursor) закроет для вас старый Cursor.

...