У меня есть 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);
}
});
}
Отслеживание выбранных элементов в 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);
}
}
});
Представления в ListView возвращаются, поэтому, если выбранный вид отключается от экрана, он, вероятно, повторно используется для одного из текущих видимых элементов. Это может быть странное поведение, которое вы описываете? Если вы хотите сделать несколько потенциальных действий на основе выбора элемента, как правило, это делается с помощью контекстного меню с длинным нажатием +.
Какое странное поведение?