Intereting Posts
Файлы Android APK и файлы DEX не созданы, без предупреждения или ошибки Как сбросить рейтинги Google Play Games до публикации? Приложение Android требует больших файлов данных 'RealmNoticeModelClass' имеет первичный ключ, вместо этого используйте 'createObject (Class <E>, Object)' VideoView onResume теряет буферную часть видео Phonegap 3 – Оповещение о том, что если я нажму ok, то произойдет сбой broswer JUnit4 – AssertionFailedError: тестов не найдено Android: ваш контент должен иметь ListView, чей атрибут id – android.R.id.list RunOnUiThread vs Looper.getMainLooper (). Сообщение в Android Android Загрузить несколько файлов и показать прогресс в ListView Модернизация сети делает сетевые вызовы в основном потоке? Возвращение двух видов деятельности? Я не понимаю, почему это ClassCastException происходит Лучший способ для локального HTML-файла связываться с (read / write) локальным файлом Excel .xlsm Excel Как переключать темы (ночной режим) без перезапуска?

Фоновый селектор в элементе RecyclerView

Я использую RecyclerView как RecyclerView ниже:

 <android.support.v7.widget.RecyclerView android:id="@+id/list" android:layout_width="320dp" android:layout_height="match_parent"/> 

И мой элемент списка:

 <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/selector_medium_high"> <com.basf.suvinil.crie.ui.common.widget.CircleView android:id="@+id/circle" android:layout_width="22dp" android:layout_height="22dp"/> <TextView android:id="@+id/label" android:layout_width="match_parent" android:layout_height="wrap_content" android:minHeight="57.5dp"/> </LinearLayout> 

Подробнее см. Эту android:background="@drawable/selector_medium_high" это обычный селектор:

 <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@color/background_high" android:state_activated="true"/> <item android:drawable="@color/background_high" android:state_pressed="true"/> <item android:drawable="@color/background_high" android:state_checked="true"/> <item android:drawable="@color/background_high" android:state_focused="true"/> <item android:drawable="@color/background_medium"/> </selector> 

Но когда я запускаю этот код, у меня нет изменений в цвете фона, когда я касаюсь строки ….

Solutions Collecting From Web of "Фоновый селектор в элементе RecyclerView"

Установите clickable , focusable , focusableInTouchMode в true во всех элементах списка « RecyclerView ».

Добавить :

 android:background="?android:attr/selectableItemBackground" 

В item.xml

Добавление android:background="?android:attr/selectableItemBackground" my_list_item.xml " к корневому макету my_list_item.xml похоже, работает для меня (при условии, что вам нужен цвет выбора по умолчанию).

Также убедитесь, что android:layout_width корневого макета android:layout_widthmatch_parent а не wrap_content чтобы обеспечить выбор всей строки.

К сожалению, использование настраиваемых представлений для имитации выбора элементов не является хорошим решением, потому что:

  • Фокус теряется при notifyDataSetChanged
  • Фокус является проблематичным, когда взгляды ребенка являются ориентируемыми

Я написал класс базового адаптера для автоматического выбора элементов с помощью RecyclerView. Просто извлеките из него свой адаптер и используйте доступные списки состояний с помощью state_selected, как и в режиме просмотра списка.

У меня есть сообщение в блоге Здесь об этом, но вот код:

 public abstract class TrackSelectionAdapter<VH extends TrackSelectionAdapter.ViewHolder> extends RecyclerView.Adapter<VH> { // Start with first item selected private int focusedItem = 0; @Override public void onAttachedToRecyclerView(final RecyclerView recyclerView) { super.onAttachedToRecyclerView(recyclerView); // Handle key up and key down and attempt to move selection recyclerView.setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { RecyclerView.LayoutManager lm = recyclerView.getLayoutManager(); // Return false if scrolled to the bounds and allow focus to move off the list if (event.getAction() == KeyEvent.ACTION_DOWN) { if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN) { return tryMoveSelection(lm, 1); } else if (keyCode == KeyEvent.KEYCODE_DPAD_UP) { return tryMoveSelection(lm, -1); } } return false; } }); } private boolean tryMoveSelection(RecyclerView.LayoutManager lm, int direction) { int tryFocusItem = focusedItem + direction; // If still within valid bounds, move the selection, notify to redraw, and scroll if (tryFocusItem >= 0 && tryFocusItem < getItemCount()) { notifyItemChanged(focusedItem); focusedItem = tryFocusItem; notifyItemChanged(focusedItem); lm.scrollToPosition(focusedItem); return true; } return false; } @Override public void onBindViewHolder(VH viewHolder, int i) { // Set selected state; use a state list drawable to style the view viewHolder.itemView.setSelected(focusedItem == i); } public class ViewHolder extends RecyclerView.ViewHolder { public ViewHolder(View itemView) { super(itemView); // Handle item click and set the selection itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // Redraw the old selection and the new notifyItemChanged(focusedItem); focusedItem = mRecyclerView.getChildPosition(v); notifyItemChanged(focusedItem); } }); } } } 

Если ничего из этого не работает для вас, как это не для меня, используйте этот код:

 android:foreground="?android:attr/selectableItemBackground" 

Уловка в android:foreground атрибут android:foreground

  viewHolder.mRlPrince.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (event.getAction()==MotionEvent.ACTION_DOWN){ viewHolder.mRlPrince.setBackgroundColor(Color.parseColor("#f8f8f8")); }if (event.getAction()==MotionEvent.ACTION_UP){ viewHolder.mRlPrince.setBackgroundColor(Color.WHITE); } return false; } }); 

Добавьте этот атрибут ниже в свой элемент "my_list_item.xml"
android:descendantFocusability="blocksDescendants" Это работает для меня!

Вам нужно установить android:clickable="true" в элементе xml, и если в вашем представлении есть несколько селекторов, вы должны установить android:duplicateParentState="true" там тоже. Thats работает на pre honeycomb apis.

Как и многие другие, единственный способ – объединить селекторы и новые классы для отслеживания выбора, но лучше делегировать это вычисление адаптеру. Библиотека FlexibleAdapter отслеживает выбор для вас, изменение конфигурации также совместимо.

Цвет фона с пульсацией теперь можно выполнить без части XML, но в коде для управления динамическими данными.

Наконец, вы можете использовать множество функций с одной и той же библиотекой, выбор – это крошечная базовая функция, которую вы можете иметь.

Пожалуйста, ознакомьтесь с описанием, страницами Wiki и полным рабочим примером: https://github.com/davideas/FlexibleAdapter