Выберите первый элемент в ListView с помощью Cursor Loader

У меня есть приложение для Android, которое (на планшетах) использует поток главной детали, чтобы показать список прогнозов слева и подробную информацию справа. Я хочу, чтобы иметь возможность выбрать первый элемент, когда приложение загружается.

У меня есть код в методе onLoadFinished, который устанавливает выбранный индекс. Я реализовал это, потому что иногда пользователь выбирал элемент, и если бы они меняли ориентацию, он был бы выключен. Я использовал этот следующий метод, чтобы убедиться, что как только он загрузит правильный элемент, он снова выбран:

@Override
public void onLoadFinished(Loader<cursor> loader, Cursor data) {
 mForecastAdapter.swapCursor(data);
 // If we have a selected index - select it.
 if(mSelectedIndex != ListView.INVALID_POSITION) {
 mForecastListView.setSelection(mSelectedIndex);
 }
}
</cursor>

Я попробовал добавить оператор else, который проверял, использовался ли планшет, чтобы выбрать первый элемент. Код был выполнен, но, похоже, это произошло до того, как действительно загрузился список, и элемент не был выбран. Где я должен помещать код для выбора первого элемента после открытия приложения?

ИЗМЕНИТЬ Вот метод, который я пробовал, не повезло:

@Override
public void onLoadFinished(Loader<cursor> loader, Cursor data) {
 mForecastAdapter.swapCursor(data);
 // If we have a selected index - select it.
 if(mSelectedIndex != ListView.INVALID_POSITION) {
 mForecastListView.setSelection(mSelectedIndex);
 } else if(mForecastAdapter.IsTwoPane()){
 mForecastListView.setSelection(0);
 }
}
</cursor>
3 ответа

Я решаю проблему, хотя этот вопрос устарел. Мое решение:

@Override
public void onLoadFinished(Loader<cursor> cursorLoader,Cursor cursor){
 mForecastAdapter.swapCursor(cursor);
 if(mPositon!=ListView.INVALID_POSITION){
 mListView.smoothScrollToPosition(mPositon);
 }else if(mTwoPane){
 {
 new Handler().post(new Runnable() {
 @Override
 public void run() {
 mListView.performItemClick(mListView, 0, mListView.getAdapter().getItemId(0)); }
 });
 }
 }
}
</cursor>


Я бы сделал следующее: я сделал это для просмотра в целом, также должен работать с курсорами.

В вашем адаптере создайте поле для выбранной позиции

public int selectedPos = 0;//use setter/getter eventually

Теперь убедитесь, что OnItemClickListener/OnItemSelectedListener для вашего listView делает следующее:

<your_adapter_instance>.selectedPos = positionSelected;
</your_adapter_instance>

Наконец, в getView() для вашего адаптера выполните следующие действия:

if(position == selectedPos) {
 //do what you want to show selection
} else {
 //do what you want for default state of the list items
}

Это гарантирует, что, когда список будет показан в первый раз, selectedPos будет 0, и поэтому первая позиция будет выбрана в соответствии с вышеизложенным.

Если вы хотите сохранить свой выбор пользователя с помощью orientChange и подобных, вам просто нужно убедиться, что как только вы "восстановите", вы передадите информацию адаптеру.


Если вы пытаетесь восстановить список из-за изменения конфигурации, возможно, сохранение состояния поможет? Например:

private Parcelable mForceastListViewSavedState;
private int mForecastListViewPositionSavedState;
private static final String sForecastListViewSavedStateKey = "ForecastListViewSavedState";
private static final String sForecastListViewPositionSavedState = "ForecastListViewPositionSavedState";
@Override
public void onSaveInstanceState(Bundle outState) {
 if(mForecastListView != null){
 outState.putParcelable(sForecastListViewSavedStateKey, mForecastListView.onSaveInstanceState());
 outState.putInt(sForecastListViewPositionSavedState, mForecastListView.getFirstVisiblePosition());
 }
 super.onSaveInstanceState(outState);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
 ...
 //Restore InstanceState
 if (savedInstanceState != null){
 mForceastListViewSavedState = savedInstanceState.getParcelable(sForecastListViewSavedStateKey);
 mForecastListViewPositionSavedState = savedInstanceState.getInt(sForecastListViewPositionSavedState);
 }
}
@Override
public void onLoadFinished(Loader<cursor> loader, Cursor data) {
 mForecastAdapter.swapCursor(data);
 //Restore ListView State
 if (mForceastListViewSavedState != null){
 mForecastListView.onRestoreInstanceState(mForceastListViewSavedState);
 mForecastListView.setSelection(mForecastListViewPositionSavedState);
 }
}
</cursor>

licensed under cc by-sa 3.0 with attribution.