Intereting Posts
Android-приложение вылетает на Lollipop Как установить разные темы для раздутого макета в виде заглушки Вводить CSS на сайт с webview в android Как узнать, было ли приложение перенесено на SD-карту на Android Android – с помощью addJavaScriptInterface для возврата значения из Javascript Android ZBar Exception только с созданием Jenkins Как установить непрозрачность фигуры? Должен ли доступ к SharedPreferences делать из потока пользовательского интерфейса? Вопросы о поддержке calabash-android в Android Studio: Ruby, Редактирование функций и шагов, Запуск тестов GridLayout против TableLayout Android GLSurfaceView прозрачный фон без setZOrderonTop ANDROID / WEBVIEW- Uncaught TypeError: Object не имеет метода changeActivity в файле: Могу ли я создать приложение для Android в качестве отладки, но подписать с хранилищем ключей GcmListenerService не вызывается, когда приложение находится в фоновом режиме Android Не удалось запустить эмулятор: не удается запустить программу

Выберите первый элемент в 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); } } 

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

EDIT Вот метод, который я пробовал, не повезло:

 @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); } } 

Solutions Collecting From Web of "Выберите первый элемент в ListView с помощью Cursor Loader"

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

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

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

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

 <YOUR_ADAPTER_INSTANCE>.selectedPos = positionSelected; 

Наконец, в 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, и поэтому первая позиция будет выбрана в соответствии с вышеизложенным.

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

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

 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); } } 

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

 @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)); } }); } } }