2014-11-10 3 views
0

ArrayList содержит строковые значения в следующем порядке: «ЗЕЛЕНЫЙ», «ЗЕЛЕНЫЙ», «КРАСНЫЙ», «КРАСНЫЙ», «ЗЕЛЕНЫЙ», «ЗЕЛЕНЫЙ». Значения корректно отображаются в ListView ListActivity.Android - Strange Ошибка ListView

Я установил его так, чтобы при нажатии любого элемента в элементе ListView все элементы со строковым значением «RED» удаляются из списка. Однако проблема заключается в том, что ListView, несмотря на то, что контейнер значений теперь содержит только значения «ЗЕЛЕНЫЕ», визуально показывает удаление двух значений «ЗЕЛЕНЫЙ», поэтому теперь ListView показывает «ЗЕЛЕНЫЙ», «ЗЕЛЕНЫЙ», «КРАСНЫЙ», RED ", даже если адаптер содержит значения" ЗЕЛЕНЫЙ "," ЗЕЛЕНЫЙ "," ЗЕЛЕНЫЙ "," ЗЕЛЕНЫЙ ".

Если адаптер содержит значения R, R, G, G, R, R, G, G и элемент щелкнул, теперь он содержит R, R, G, G.

Ошибка в коде? Отладчик, отображающий все значения «ЗЕЛЕНЫЕ» строки, действительно озадачивает, потому что ListView показывает что-то другое.

public class MyActivity extends ListActivity implements AdapterView.OnItemClickListener { 
    ArrayList<String> listValues; 
    bugtestadapter adapter; 

    /** 
    * Called when the activity is first created. 
    */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     listValues = new ArrayList<String>(); 
     listValues.add("GREEN"); 
     listValues.add("GREEN"); 
     listValues.add("RED"); 
     listValues.add("RED"); 
     listValues.add("GREEN"); 
     listValues.add("GREEN"); 

     adapter = new bugtestadapter(this, R.layout.adapter, listValues); 
     setListAdapter(adapter); 

     getListView().setOnItemClickListener(this); 
    } 

    @Override 
    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
     deleteRedValues(); 
     adapter.notifyDataSetChanged(); 
    } 

    public void deleteRedValues() { 
     for (Iterator<String> iterator = listValues.iterator(); iterator.hasNext();) { 
      String c = iterator.next(); 
      if (c.equals("RED")) { 
       iterator.remove(); 
      } 
     } 
    } 
} 

bugtestadapter.java

public class bugtestadapter extends ArrayAdapter<String> { 

    Context mContext; 
    ArrayList<String> adapterList; 
    LayoutInflater inflater; 

    public bugtestadapter(Context context, int resource, ArrayList<String> objects) { 
     super(context, resource, objects); 
     mContext = context; 
     adapterList = (ArrayList)objects; 
     inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     if (convertView == null) { 
      convertView = inflater.inflate(R.layout.adapter, null); 
      TextView tv = (TextView) convertView.findViewById(R.id.adapterItem); 
      tv.setText(adapterList.get(position)); 

      if (tv.getText().equals("GREEN")) 
       tv.setTextColor(Color.GREEN); 
      else if (tv.getText().equals("RED")) 
       tv.setTextColor(Color.RED); 
     } 

     return convertView; 
    } 
} 
+1

четкий перечень адаптер –

+0

Очистка адаптер список очищает все значения. Я только пытаюсь удалить значения «RED». Проблема здесь в том, что контейнер содержит только значения «ЗЕЛЕНЫЕ», но ListView показывает «RED» значения, которые были удалены. – ShrimpCrackers

+0

... и если convertView не равен нулю? – Simon

ответ

2

В методе GetView инициализации представления в условии, если есть, если (convertView == NULL) и установить Teh данные вне цикла.

@Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
Holder holder; 
     if (convertView == null) { 
holder=new Holder(); 
       convertView = inflater.inflate(R.layout.adapter, null); 
       holder.tvName = (TextView) convertView.findViewById(R.id.adapterItem); 
      }else{ 
holder=convertView.getTag(); 
} 

tv.setText(adapterList.get(position)); 
      if (tv.getText().equals("GREEN")) 
       tv.setTextColor(Color.GREEN); 
      else if (tv.getText().equals("RED")) 
       tv.setTextColor(Color.RED); 
     return convertView; 
    } 

и добавьте к нему держатель.

private class Holder{ 
TextView tvName; 
} 
+0

Спасибо. Кажется, я понимаю, что происходит. После того, как вы установите значение вида, и оно будет сохранено с помощью держателя, оно будет повторно использовать это значение, если это необходимо. Таким образом, текстовое значение для представления для определенной позиции внутри держателя по-прежнему настроено на любой текст, на который он был установлен. – ShrimpCrackers

+0

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

1

Вы должны сделать это с держатель класса, как показано ниже:

public class bugtestadapter extends ArrayAdapter<String> { 

    Context mContext; 
    ArrayList<String> adapterList; 
    LayoutInflater inflater; 

    public bugtestadapter(Context context, int resource, ArrayList<String> objects) { 
     super(context, resource, objects); 
     mContext = context; 
     adapterList = (ArrayList)objects; 
     inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     final ViewHolder holder; 
     if (convertView == null) { 
      holder = new ViewHolder(); 
      convertView = inflater.inflate(R.layout.adapter, null); 
      holder.tv = (TextView) convertView.findViewById(R.id.adapterItem); 
      holder.tv.setText(adapterList.get(position)); 

      if (holder.tv.getText().equals("GREEN")) 
       holder.tv.setTextColor(Color.GREEN); 
      else if (tv.getText().equals("RED")) 
       holder.tv.setTextColor(Color.RED); 
     }else { 
       holder = (ViewHolder) convertView.getTag(); 
      } 


     return convertView; 
    } 

class ViewHolder { 
      TextView tv; 

     } 
} 
+0

Обычно я использую класс держателей, но я пытался сократить пример. Использование ViewHolder не решает проблему. Спасибо хоть. – ShrimpCrackers