2015-09-05 2 views
0

У меня проблема с моим простым приложением. Он использует ListView, который к: - открыть новую активность при нажатии и это в режиме просмотра - выделить выбранный элемент, когда он находится на режиме редактированияЭлемент списка ListView ListView и сброс

я делаю следующее:

 ListView lv = (ListView)findViewById(R.id.categoryListView); 

     lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, 
            long id) { 

       String entry = (String) parent.getItemAtPosition(position); 

       if (_editMode) 
        view.setBackgroundColor(Color.parseColor("#5B5B5B")); 
       else 
       { 
        Intent intent = new Intent(MainActivity.this, CategoryActivity.class); 
        intent.putExtra("CATEGORY", entry); 
        startActivity(intent); 
       } 
      } 
     }); 

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

for (int i = 0; i < lv.getAdapter().getCount(); i++) 
{ 
    lv.getChildAt(i).setBackgroundColor(Color.parseColor("#FFFFFF")); 
} 

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

Любое предложение?

Спасибо!

EDIT

Ok после Джавад ответа я просто понял, как же "GetView" метод работы. Так что это решение я использовал:

Я объявил ArrayList, содержащий выбранные элементы:

ArrayList<String> itemSelected = new ArrayList<String>(); 

Это слушатель ListView onItemClick (где вы можете выбрать и отменить выбор элементов):

lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, 
           long id) { 


       String entry = (String) parent.getItemAtPosition(position); 

       if (itemSelected.contains(entry)) 
       { 
        itemSelected.remove(entry); 
       } 
       else 
       { 
        itemSelected.add(entry); 
       } 

       ((ArrayAdapter<String>)lv.getAdapter()).notifyDataSetChanged(); 
     } 
    }); 

Это ovverride метода GetView:

itmList.setAdapter(new ArrayAdapter<String>(this,R.layout.list_black_text,R.id.list_content, itmStrList){ 
     @Override 
     public View getView(int position, View convertView, ViewGroup parent) 
     { 
      if (convertView != null) 
      { 
       if (itemSelected.contains(itmList.getAdapter().getItem(position))) { 
        convertView.setBackgroundColor(Color.RED); 
       } else { 
        convertView.setBackgroundColor(Color.parseColor("#5B5B5B")); 
       } 
      } 

      return super.getView(position, convertView, parent); 
     } 
    }); 

И это как отменить выбор всех элементов:

 itemSelected.clear(); 

     ((ArrayAdapter<String>)lv.getAdapter()).notifyDataSetChanged(); 

Спасибо человека :)

+1

вместо изменения цвета фона элемента «listview» здесь изменяется в классе адаптера 'getView (...)'. – Rustam

ответ

1

Я думаю, ваша проблема в том, ваши не обращая внимания для просмотра рециркуляции. Когда вы меняете цвет фона представления, представление может быть переработано, и у вас будет что-то не желаемое. Проверьте это link.

Вы должны иметь, скажем, логическую переменную, в ваших данных поднабора, называемых такими, как isSelected. И добавьте этот код в свой метод getView().

if(item.isSelected()){ 
      setBackgroundColor(Color.parseColor("#5B5B5B")); 
    } 
    else{ 
      setBackgroundColor(Color.parseColor("#FFFFFF")); 
    } 

Затем в onItemClick добавить заменить view.setback ... по

lv.getAdapter().getItem(position).setSelected(true); 
    lv.getAdapter().notifyDataSetChanged(); 

Вам может понадобиться бросок.

Наконец изменить

for (int i = 0; i < lv.getAdapter().getCount(); i++) 
{ 
    lv.getChildAt(i).setBackgroundColor(Color.parseColor("#FFFFFF")); 
} 

к этому:

for (int i = 0; i < lv.getAdapter().getCount(); i++) 
{ 
    lv.getAdapter().getItem(i).setSelected(false); 
} 

lv.getAdapter().notifyDataSetChanged(); 

Причина, почему ваша часть кода работает только тогда, когда все элементы являются видимыми, вид утилизации. Кроме того, lv.getChildAt() дает вам только видимые виды. После этого ваш код может быть поврежден, потому что adapter.getcount может быть больше, чем число дочерних элементов списка.

Надеюсь, это поможет.

Смежные вопросы