2016-07-07 195 views
1

我使用BaseAdapter和ViewHolder模式显示ListView。getView在列表适配器中提供的错误视图

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); 
      } 
     } 
    } 

} 

的代码只是显示在列表视图,其中每一行包含从数组中的项的数组的内容,但是,如果该项目的值是“A”,该行节目显示不同的图标。这种状况在getView(...)方法的这一部分提出:

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

在创建活动中,似乎一切都OK:

enter image description here

但是当我向下滚动listView,A字母的图标随机显示为不同于A的字母。

enter image description here

我在做什么错?

回答

4

Android正在回收列表中的视图,并且您设置图标“A”的视图作为参数传递给方法getView,当它不可见时。 解决的办法是重新设置默认的图标,就像这样:

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

必须为所有视图更新的图标(而不是只为那些以字母“A”)。

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