Android. Сохраняйте элемент списка ListView один раз, когда вы нажали

Таким образом, у меня есть активность с 2 виджетами ListView , когда вы выбираете значение в первом, второе заполняется значениями, относящимися к выбору в первом ListView . Этот механик работает без проблем, но теперь я хочу, чтобы пользовательские варианты оставались выделенными. Я прочитал хороший вопрос, связанный с этой темой, и кажется, что существует множество способов достичь этого, но после того, как вы попробовали около 4-5 из них, я все еще не могу заставить его работать.

У меня есть работа над вторым ListView с использованием XML-атрибута android:listSelector="#CCCCCC" , но это, кажется, очищается после того, как в OnItemClickListener добавлен OnItemClickListener (например, тот, который я использую в моем первом ListView ).

Пока что у меня есть:

Пользовательский OnItemClickListener Я нашел просмотр различных ответов на этот вопрос (слегка изменил его, чтобы он мог загрузить мою информацию во второй ListView):

 private class ItemHighlighterListener implements OnItemClickListener { private View oldSelection = null; public void clearSelection() { if(oldSelection != null) { oldSelection.setBackgroundColor(android.R.color.transparent); } } public void onItemClick(AdapterView parent, View view, int pos, long id) { clearSelection(); oldSelection = view; view.setBackgroundDrawable(view.getContext().getResources().getDrawable(R.drawable.list_selector)); loadClubs(mXMLPortalOptions.getRegion(pos).getId()); mClubList.setAdapter(new ArrayAdapter(getApplicationContext(), R.layout.list_item_white, mClubs)); } } 

Вот мой файл list_selector.xml :

          

Метод (OnItemClick) вызывается и выполняется, но фон моего ListItem остается одного и того же цвета: /

Я не могу поверить, что эта простая задача оказалась настолько сложной.

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

Поместите переменную позиции для выбранного элемента. Измените позицию в onItemClicked() . Проверьте выбранную позицию в списке Адаптер внутри getView() и установите фон для выбранного элемента.

 public class TestAdapter extends BaseAdapter { private Context context; private ArrayList testList; private int selectedIndex; private int selectedColor = Color.parseColor("#1b1b1b"); public TestAdapter(Context ctx, ArrayList testList) { this.context = ctx; this.testList = testList; selectedIndex = -1; } public void setSelectedIndex(int ind) { selectedIndex = ind; notifyDataSetChanged(); } @Override public int getCount() { return testList.size(); } @Override public Object getItem(int position) { return testList.get(position); } @Override public long getItemId(int position) { return position; } private class ViewHolder { TextView tv; } @Override public View getView(int position, View convertView, ViewGroup parent) { View vi = convertView; ViewHolder holder; if(convertView == null) { vi = LayoutInflater.from(context).inflate(R.layout.test_list_item, null); holder = new ViewHolder(); holder.tv = (TextView) vi; vi.setTag(holder); } else { holder = (ViewHolder) vi.getTag(); } if(selectedIndex!= -1 && position == selectedIndex) { holder.tv.setBackgroundColor(Color.BLACK); } else { holder.tv.setBackgroundColor(selectedColor); } holder.tv.setText("" + (position + 1) + " " + testList.get(position).getTestText()); return vi; } } 

Теперь задайте переменную selectedIndex, когда элемент списка щелкнул.

 public class TestActivity extends Activity implements OnItemClickListener { // Implemented onItemClickListener @Override public void onItemClick(AdapterView parent, View view, int position, long id) { adapter.setSelectedIndex(position); } } 

Чтобы расширить решение Shaiful, вы можете не заставить его работать в вашей ситуации.

Если вы используете свой код в public void onListItemClick(ListView l, View v, int index, long id) , если вы используете fragmentы и должны объявлять интерфейс вместо реализации OnListItemClickListener или что-то другое, вызывающее вашу среду IDE генерировать ошибки, вам может потребоваться доступ к переменным и методам статически.

 public static int selectedPosition = 0; ArrayAdapter adapter = null; @Override public void onListItemClick(ListView l, View v, int index, long id) { super.onListItemClick(l, v, index, id); selectedPosition = index; Your_adapter.setSelectedIndex(selectedPosition); adapter.notifyDataSetChanged(); } 

И в Your_adapter:

 private static int selectedIndex; //public Your_adapter... public static void setSelectedIndex(int ind) { selectedIndex = ind; } @Override public View getView(int position, View convertView, ViewGroup parent) { WellHolder holder = null; if (null == convertView) { //set up your "holder" } if (position == selectedIndex) { convertView.setBackgroundColor(convertView.getResources().getColor(R.color.cyan)); } else { convertView.setBackgroundColor(convertView.getResources().getColor(R.color.silver)); } return convertView; } 

Некоторые другие отличия заключаются в том, что вам не нужно инициализировать какие-либо переменные, поскольку в вашей деятельности вызывается «0» или «-1», а notifyDataSetChanged ().

Еще раз спасибо за ваше решение @Shaiful. Это, безусловно, помогло мне сэкономить время, пытаясь получить то, что по умолчанию в iOS для работы на Android, все, избегая при этом селектора / элемента / сфокусированного / нажатого / и т. Д.

Я столкнулся с подобной проблемой. Это мое решение:

Сначала добавьте настраиваемый селектор списков в список:

  

Внутри listselector.xml:

     

И, наконец, вытягиваемый bg.xml с цветом вашей подсветки:

     

lv.setSelector(R.drawable.highlighter);

поместить изображение highlighter.png в папку с возможностью переноса
Простейший способ выделить выделенный элемент в виде списка.

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

В возобновлении: только когда ваш палец находится на экране, элемент выбирается.

Другая возможность – сохранить, какой элемент выбран в var и paint, используя ваш пользовательский адаптер, например Shaiful.

 //create a list_itemselectorin drawable folder //you will get the list item selected background color change once you select //the item               //create a list in layout folder  

// И посмотрим вывод.

Я думаю, что лучшее и самое простое решение – это. Вам не нужно устанавливать какой-либо android:listSelector в самом ListView или вносить какие-либо изменения в адаптер. Вам даже не нужно вызывать какой-либо setSelection(position) в OnItemClickListener поскольку он обрабатывается автоматически.

  1. Установите в ListView:

     android:choiceMode="singleChoice" 
  2. Установите фон самого элемента списка:

     android:background="?android:attr/activatedBackgroundIndicator" 
  3. Вот и все.

Таким образом вы получите поведение системы по умолчанию. Вот как это делается в макете android.R.layout.simple_list_item_activated_1 по умолчанию.

Если вы можете использовать drawable для отображения listItem Highlighted, вы должны использовать следующий код:

 listView.setSelector(R.drawable.bg_image); 

Оно работает.

Существует простое полностью-XML-решение, которое сработало для меня. Во-первых, определите XML-drawable с селекторным кодом, в котором «нормальное» состояние будет соответствовать «выбранному не нажатому» визуальному состоянию элемента списка, а state_pressed = true – «нажатому» визуальному состоянию. Пример файла «custom_item_selector.xml», напоминающий выбор голубого голубого:

                    1                    1                    

(также может быть установлено сосредоточенное состояние). Во-вторых, примените этот xml-drawable как ListSelector ListView и установите желаемый параметрMode:

  

Это все. Он позволяет определять различные визуальные состояния для «просто выбранных» и «нажатых выбранных» элементов, например, делая ярлыки при нажатии.

Чтобы подсвечивать элементы списка (множественный выбор), при нажатии (активируется), выполните следующие действия.

1. Установите фон, чтобы перечислить макет элемента как возможно.

         

2. Выбираемый селектор

      

3. Режим множественного выбора Listview

. GetListView () setChoiceMode (ListView.CHOICE_MODE_MULTIPLE);

При нажатии : введите описание изображения здесь

Ниже показано изображение, когда пользователь выбрал несколько элементов списка.

При активации : введите описание изображения здесь

Подводя итог этому сообщению и, возможно, помогите кому-то в будущем, я предлагаю ответ 🙂

Во-первых, нам нужно создать файл res/drawable/list_item_background.xml со следующим содержимым:

      

Конечно, укажите свои ресурсы. И вы также можете добавить другие с разными состояниями, такими как state_pressed , state_focused и т. Д.

Затем мы должны установить параметр background в наш элемент списка ViewGroup элемента управления (fi res/layout/list_item_layout.xml ) следующим образом:

 android:background="@drawable/list_item_background" 

Следующий шаг – изменение нашего пользовательского classа Adapter . Вот следующий fragment кода:

 public class CustomAdapter extends BaseAdapter { private List items; private LayoutInflater itemInflater; private int selectedIndex; // add this public CustomAdapter(Context c, List items) { this.items = items; this.itemInflater = LayoutInflater.from(c); selectedIndex = -1; // add this } /* add this */ public void setSelectedIndex(int index) { selectedIndex = index; notifyDataSetChanged(); } /* other adapter's stuff */ @Override public View getView(int position, View convertView, ViewGroup parent) { if(convertView == null) { convertView = itemInflater.inflate(R.layout.list_item_layout, parent, false); } // add this convertView.setActivated(selectedIndex != -1 && position == selectedIndex); /* do some stuff */ return convertView; } } 

Наконец, мы должны вызвать метод setSelectedIndex(position) в методе onItemClick(...) AdapterView.OnItemClickListener .

 public class YourActivity extends Activity implements AdapterView.OnItemClickListener { private CustomAdapter mCustomAdapter; /* activity implementation */ @Override public void onItemClick(AdapterView parent, View view, int position, long id) { mCustomAdapter.setSelectedIndex(position); } } 

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

PS Если мы хотим включить режим множественного выбора в нашем списке, мы просто поместим следующую строку в наш class активности, где хранится экземпляр listView :

 listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); 

Таким образом, мы получим правильное выделение нескольких элементов.

– Надеюсь, это кому-то поможет 🙂

Давайте будем гением компьютера.