2016-07-07 2 views
1

BaseAdapterとViewHolderパターンを使用してListViewを表示しています。Listアダプタで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」である場合、行を表示する別のアイコンを表示するリストビュー内のアレイのコンテンツを表示します。

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

アクティビティが作成されると、すべてがOKのようです:

enter image description here

けど、その条件は、getViewメソッド(...)方法のこの部分で作られています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); 
} 
関連する問題