Intereting Posts
База quickblox Плохая временная метка для 4.1.2 Android как отправлять и получать изображение и местоположение (используя карту) в групповом чате с помощью xmpp-smack Как реализовать навигационный ящик с детальными деталями фрагментов Как создать обратный совместимый виджет приложений подкачки Android? Добавить значок с заголовком в CollapsingToolbarLayout RoboGuice 3.0 NoClassDefFoundError: roboguice.inject.ContextScopedRoboInjector В чем смысл addToBackStack с нулевым параметром? Метод ContentObserver onChange () вызывается много раз Предотвращение слишком большого растрового изображения для добавления в текстуру android Как воспроизводить звук через динамик, даже если гарнитура подключена? Как получить ширину текста при использовании нескольких параметров Что такое android: includeFontPadding? Чтение pdf, сохраненное во внутренней памяти (путь к файлу не действителен) Android: поднять AlertDialog из фоновой темы Как автоматически очистить кеш-память?

Элементы ListView не отображаются как активированные

Итак, все отлично работает на смартфонах. Тем не менее, на планшетах мой ListView должен отображаться как левый навигационный элемент, при этом активируемый в данный момент элемент расширяется в фрагменте детали. И это отлично работает. Однако активированный элемент ListFragment не отображается как выбранный. Я установил android:choiceMode для singleChoice . У меня активирован правильный селектор, и при нажатии элемента появляется фоновый чертеж. Селектор имеет подходящий элемент для android:state_activated="true" . Я указываю android:activatedBackgroundIndicator в моем файле styles.xml . Когда я регистрирую вывод listView.getCheckedItemCount() внутри onListItemClick он возвращает мне 1 как я ожидал.

Когда-то, несколько недель назад, у меня даже было все, что работало точно так же, как предполагалось, с ArrayAdapter , прежде чем я начал ArrayAdapter свой источник данных, и до того, как начал использовать макет элемента пользовательского списка. И затем где-то по пути я сделал что-то, что активировал элементы, отображаемые неправильно, но я не уверен, что это было.

selectable_background.xml

 <selector xmlns:android="http://schemas.android.com/apk/res/android" android:exitFadeDuration="@android:integer/config_mediumAnimTime" > <item android:state_pressed="false" android:state_focused="true" android:drawable="@drawable/list_focused" /> <item android:state_pressed="true" android:drawable="@drawable/pressed_background" /> <!-- selected --> <item android:state_activated="true" android:drawable="@drawable/pressed_background" /> <item android:state_checked="true" android:drawable="@drawable/pressed_background" /> <!-- paranoia --> <item android:state_selected="true" android:drawable="@drawable/pressed_background" /> <!-- paranoia --> <!-- default --> <item android:drawable="@android:color/transparent" /> </selector> 

fragment_list.xml

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" > <ListView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@id/android:list" android:layout_width="match_parent" android:layout_height="0dip" android:layout_weight="1" android:choiceMode="singleChoice" android:listSelector="@drawable/selectable_background" > </ListView> <TextView android:id="@id/android:empty" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingTop="16dp" android:paddingBottom="16dp" android:paddingLeft="12dp" android:paddingRight="12dp" android:text="@string/empty_list" /> </LinearLayout> 

list_item.xml

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="wrap_content" > <ImageView android:id="@+id/item_image" android:layout_width="63dp" android:layout_height="63dp" android:contentDescription="@string/list_image" android:src="@drawable/ic_thumbnail_placeholder" android:background="#f0f0f0" /> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/item_name" android:layout_width="match_parent" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceListItemSmall" android:gravity="center_vertical" android:paddingLeft="?android:attr/listPreferredItemPaddingLeft" android:paddingRight="?android:attr/listPreferredItemPaddingRight" android:minHeight="?android:attr/listPreferredItemHeightSmall" /> </LinearLayout> 

MyListFragment.java

 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.getActivity().getLoaderManager().initLoader(ALL_ITEMS_LOADER, null, this); listAdapter = new SimpleCursorAdapter( this.getActivity(), R.layout.list_item, null, new String[] { Item.NAME }, new int[] { R.id.item_name }, CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER ); this.setListAdapter(listAdapter); } @Override public Loader<Cursor> onCreateLoader(int i, Bundle bundle) { Uri queryUri; switch (i) { case ALL_ITEMS_LOADER: queryUri = Item.CONTENT_URI; return new CursorLoader(this.getActivity(), queryUri, null, null, null, null); default: throw new IllegalArgumentException("Unknown loader ID: " + i); } } @Override public void onLoadFinished(Loader<Cursor> cursorLoader, Cursor cursor) { if (listAdapter == null) { throw new IllegalStateException("List adapter is missing!"); } else { Log.d(TAG, "Load finished. Cursor swapped."); listAdapter.swapCursor(cursor); } } 

Обновить:

Я также попытался заменить SimpleCursorAdapter на SimpleCursorAdapter с которым я работал раньше, но не кубик:

 listAdapter = new ArrayAdapter<String>( this.getActivity(), R.layout.list_item, R.id.item_name, new String[] {"1", "2", "3"} ); 

Обновление 2:

Ах ах! Ключ!

 listAdapter = new ArrayAdapter<String>( this.getActivity(), android.R.layout.simple_list_item_activated_1, android.R.id.text1, new String[] {"1", "2", "3"} ); 

Это работает. Но поскольку мне действительно нужно использовать свой собственный макет, он не решает мой собственный вопрос. Чем отличается R.layout.list_item и android.R.layout.simple_list_item_activated_1 ?

Когда-то, несколько недель назад, у меня даже было все, что было сделано так, как планировалось … прежде чем я начал использовать макет элемента пользовательского списка.

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

Я бы рекомендовал разместить ваш пользовательский чертеж в качестве фона каждого элемента списка, а не селектора списка; Активировано – это состояние, применяемое к каждому виду отдельных элементов. Затем вы можете установить android:listSelector="@null" так как у вас есть прозрачный фон в некоторых состояниях, и вы не хотите, чтобы селектор по умолчанию отображался.