Выбранный элемент ListView Изменение фона

1

У меня есть ListView, который после нажатия на элемент, который я хочу, чтобы он был окончательно выбран, позволяет выполнить некоторые другие действия в зависимости от того, какая кнопка нажата. Немного похоже на RadioBox, но в пределах списка. Поэтому при нажатии фон остается желтым, и я сохраняю хранилище, в котором выбран элемент. На данный момент у меня есть это, когда он щелкнут, фон меняется, но с странным поведением, когда выбрано, и я просматриваю ListView, выбранный элемент изменяется.

Код:

ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>();
        for (int i = 0; i < titles.size(); i++){
            HashMap<String, String> map = new HashMap<String, String>();
            map.put("name", titles.get(i));
            mylist.add(map);
        }

        SimpleAdapter mSchedule = new SimpleAdapter(this, mylist, R.layout.listcell,
                new String[] {"name"}, new int[] {R.id.txtItemName}); 

        ListView listView1 = (ListView) findViewById(R.id.ListView01); 
        listView1.setAdapter(mSchedule); 
        listView1.setTextFilterEnabled(true);
        listView1.setOnItemClickListener(new OnItemClickListener() { 
                    @Override
                    public void onItemClick(AdapterView<?> a, View v, int position, long id) { 
                        Log.v("Test", v.toString());
                        v.setBackgroundResource(R.drawable.newbackground);
                    }
                });
}
Теги:
listview

2 ответа

0

Отслеживание выбранных элементов в HashSet. Переопределите метод SimpleAdapter.getView(), чтобы назначить фоновый ресурс на основе выбранных элементов HashSet.

    final HashSet<String> selectedItems = new HashSet<String>();
    SimpleAdapter mSchedule = new SimpleAdapter(this, mylist, R.layout.listcell,new String[] {"name"}, new int[] {R.id.txtItemName}) {
        @Override
        public View getView(int position, View v, ViewGroup parent) {
            if(v!= null) {
                String title = titles.get((int)this.getItemId(position));
                if(selectedItems.contains(title)) {
                    v.setBackgroundResource(R.drawable.newbackground);
                } else {
                    v.setBackgroundResource(0);
                }
            }
            return super.getView(position, v, parent);
        }
    };
    ListView listView1 = (ListView)findViewById(R.id.listView1);        
    listView1.setAdapter(mSchedule); 
    listView1.setTextFilterEnabled(true);        
    listView1.setOnItemClickListener(new OnItemClickListener() { 
        @Override
        public void onItemClick(AdapterView<?> a, View v, int position, long id) {      
            String title = titles.get((int)id);
            if(selectedItems.contains(title)) {
                v.setBackgroundResource(0);
                selectedItems.remove(title);

            } else {
                v.setBackgroundResource(R.drawable.newbackground);
                selectedItems.add(title);
            }                
        }

    });        
  • 0
    Эй, спасибо за ответ, я не очень понимаю. Я собираюсь добавить свой код к вопросу, не могли бы вы сказать, как ваш ответ может относиться к моей проблеме?
  • 0
    Android перерабатывает взгляды. В вашем случае вы захотите расширить SimpleAdapter и предоставить реализацию setViewText () и setViewImage (), которая устанавливает цвет фона для представления.
0

Представления в ListView возвращаются, поэтому, если выбранный вид отключается от экрана, он, вероятно, повторно используется для одного из текущих видимых элементов. Это может быть странное поведение, которое вы описываете? Если вы хотите сделать несколько потенциальных действий на основе выбора элемента, как правило, это делается с помощью контекстного меню с длинным нажатием +.

Какое странное поведение?

  • 0
    Похоже, вы правы в этом, я прокручиваю и затем возвращаюсь туда, где я был, и это будет другой выбранный пункт. Это не может быть долгое нажатие, его нужно щелкнуть, фон меняется, и тогда я могу либо удалить, либо начать новое намерение в зависимости от следующего нажатия кнопки.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню