2016-07-07 60 views
1

Ich zeige eine ListView mit einem BaseAdapter und dem ViewHolder-Muster.Falsche Ansicht von GetView im List-Adapter

public class ListViewActivity extends AppCompatActivity { 
    private String[] letters = {"A", "B", "C", "D", 
      "E", "F", "G", "H", "I", "J", "K", "L", 
      "M", "N", "O","P", "Q"}; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.act_lv); 

     final ListView listView = (ListView) findViewById(R.id.listView); 

     listView.setAdapter(new TestBaseAdapter(this, letters)); 
    } 

    class TestBaseAdapter extends BaseAdapter { 
     private Context context; 
     private String[] values; 
     private LayoutInflater inflater; 
     public TestBaseAdapter(Context context, String[] values) { 
      this.context = context; 
      this.values = values; 
      this.inflater = LayoutInflater.from(this.context); 
     } 

     @Override 
     public int getCount() { 
      return values.length; 
     } 

     @Override 
     public Object getItem(int position) { 
      return values[position]; 

     } 

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

      if (convertView == null) { 
       convertView = inflater.inflate(R.layout.lv_layout, parent, false); 
       myViewHolder = new MyViewHolder(convertView); 
       convertView.setTag(myViewHolder); 
      } else { 
       myViewHolder = (MyViewHolder) convertView.getTag(); 
      } 

      myViewHolder.title.setText((String)getItem(position)); 
      if (((String)getItem(position)).equals("A")) { 
       myViewHolder.icon.setImageResource(R.drawable.custom_icon); 
      } 

      return convertView; 
     } 

     private class MyViewHolder { 
      TextView title; 
      ImageView icon; 

      public MyViewHolder(View item) { 
       title = (TextView) item.findViewById(R.id.label); 
       icon = (ImageView) item.findViewById(R.id.logo); 
      } 
     } 
    } 

} 

Der Code zeigt nur den Inhalt des Feldes in der Listenansicht, wobei jede Reihe ein Element aus dem Array enthält, aber wenn der Elementwert „A“ ist, zeigt die Zeile zeigt ein anderes Symbol. Diese Bedingung in diesem Teil der gemacht wird getView (...) Methode:

... 
if (((String)getItem(position)).equals("A")) { 
    myViewHolder.icon.setImageResource(R.drawable.custom_icon); 
} 
... 

Wenn die Aktivität erstellt wird, scheint alles in Ordnung zu sein:

enter image description here

aber wenn ich scrollen Listenansicht nach unten, wird das Symbol für den A Brief anders

A. zufällig über Briefe gezeigt enter image description here

Was mache ich falsch?

Antwort

4

Android recycelt die Ansichten in der Liste, und die Ansicht, für die Sie das Symbol "A" festlegen, wird als Argument an die Methode getView übergeben, wenn sie nicht sichtbar ist. Die Lösung ist das Standardsymbol wieder einzustellen, wie folgt aus:

if (((String)getItem(position)).equals("A")) { 
    myViewHolder.icon.setImageResource(R.drawable.custom_icon); 
} else { 
    myViewHolder.icon.setImageResource(/*your default image*/); 
} 
2

Sie müssen das Symbol aktualisieren für alle Ansichten (und nicht nur für diejenigen mit dem Buchstaben „A“).

if (((String)getItem(position)).equals("A")) { 
    myViewHolder.icon.setImageResource(R.drawable.custom_icon); 
} else { 
    myViewHolder.icon.setImageResource(R.drawable.DEFAULT_ICON_ID); 
}