2015-05-24 4 views
0

Я хотел бы изменить цвет фона элемента при нажатии, в простом спискеView. Вот мой код:Изменить цвет фона элемента в простом спискеView

boolean[] selectedItem = new boolean[listElement.length] 
final ArrayList<String> list1 = new ArrayList<>(); 
Collections.addAll(list1, listElement); 
final ListView mylist = (ListView) findViewById(R.id.listView); 
final ArrayAdapter<String> adapter = new ArrayAdapter<>(context, android.R.layout.simple_list_item_1, list1); 
mylist.setAdapter(adapter); 
mylist.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> arg0, View arg1, int pos, long arg3) { 

      int firstVisiblePosition = mylist.getFirstVisiblePosition(); 
      int effectivePosition = pos - firstVisiblePosition; 

      if (!selectedItem[pos]) { 
       mylist.getChildAt(effectivePosition).setBackgroundColor(Color.parseColor("#66F44336")); 
      } else { 
       mylist.getChildAt(effectivePosition).setBackgroundColor(Color.parseColor("#EEEEEE")); 
      } 

      selectedItem[pos] = !selectedItem[pos]; 
     } 
    }); 

Когда список короток (без прокрутки не участвует) он работает, когда он долго не будет: цвет фона щелкнутого элемента делает изменения, но когда я начинаю прокручивать цвет фона каждый элемент начинает меняться, и я не могу найти никакой логики в этих изменениях, они меняются и меняются, даже если я даже не трогаю их, просто прокручивая, что странно, поскольку цвет должен меняться только при вызове onItemClick() , правильно? Что мне не хватает?

ответ

2

Вам не хватает того, что ListView повторно использует свои макеты элементов, когда они выходят из экрана (т. Е. Вы просматриваете список).

Вам необходимо сохранить фон для каждого элемента и установить его после запроса вида. Это происходит внутри ListView адаптера getView.

Быстрое исправление будет использовать пользовательский адаптер на ходу:

final boolean[] selectedItem = new boolean[listElement.length]; 

ArrayAdapter<String> adapter = new ArrayAdapter<String>(context, 
     android.R.layout.simple_list_item_1, list1) { 
    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View view = super.getView(position, convertView, parent); 
     if (selectedItem[position]) { 
      view.setBackgroundColor(Color.parseColor("#66F44336")); 
     } else { 
      view.setBackgroundColor(Color.parseColor("#EEEEEE")); 
     } 
     return view; 
    } 
}; 

Это не хватает проверку ошибок, но вы должны получить идею. Удачи!