Tenho uma lista com items que possuem imagens(ou não).
Segue meu código de exemplo:
public class MainActivity extends Activity {
ListView mListView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mListView = new ListView(this);
setContentView(mListView);
String[] arr = new String[] {
"/exemplo/images/1.jpg", "/exemplo/images/2.jpg",
"/exemplo/images/3.jpg", "/exemplo/images/4.jpg",
"/exemplo/images/5.jpg", "/exemplo/images/6.jpg",
"/exemplo/images/7.jpg", "/exemplo/images/8.jpg",
"/exemplo/images/9.jpg", "/exemplo/images/1.jpg",
"/exemplo/images/2.jpg", "/exemplo/images/3.jpg",
"/exemplo/images/4.jpg", "/exemplo/images/5.jpg",
"/exemplo/images/6.jpg", "/exemplo/images/7.jpg",
"/exemplo/images/8.jpg", "/exemplo/images/9.jpg",
"/exemplo/images/1.jpg", "/exemplo/images/2.jpg",
"/exemplo/images/3.jpg", "/exemplo/images/4.jpg",
"/exemplo/images/5.jpg", "/exemplo/images/6.jpg",
"/exemplo/images/7.jpg", "/exemplo/images/8.jpg",
"/exemplo/images/9.jpg", "/exemplo/images/1.jpg",
"/exemplo/images/2.jpg", "/exemplo/images/3.jpg",
"/exemplo/images/4.jpg", "/exemplo/images/5.jpg",
"/exemplo/images/6.jpg", "/exemplo/images/7.jpg",
"/exemplo/images/8.jpg", "/exemplo/images/9.jpg"};
List<String> list = Arrays.asList(arr);
MyAdapter adapter = new MyAdapter(this, R.layout.listitem_imv, list);
mListView.setAdapter(adapter);
}
class MyAdapter extends ArrayAdapter<String>{
List<String> mList;
LayoutInflater mInflater;
int mResource;
int count = 1;
public MyAdapter(Context context, int resource,
List<String> objects) {
super(context, resource, objects);
mResource = resource;
mInflater = getLayoutInflater();
mList = objects;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view;
if(convertView == null){
view = mInflater.inflate(mResource, null);
}else{
view = convertView;
}
ImageView imageView = (ImageView) view.findViewById(R.id.imv);
TextView textView = (TextView) view.findViewById(R.id.txv);
new LoadImage().execute(imageView);
textView.setText(mList.get(position).toString());
return view;
}
}
class LoadImage extends AsyncTask<Object, Void, Bitmap>{
private ImageView imv;
private String path;
@Override
protected Bitmap doInBackground(Object... params) {
imv = (ImageView) params[0];
path = imv.getTag().toString();
Bitmap bitmap = null;
File file = new File(
Environment.getExternalStorageDirectory().getAbsolutePath() + path);
if(file.exists()){
bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());
}
return bitmap;
}
@Override
protected void onPostExecute(Bitmap result) {
if(result != null && imv != null){
imv.setVisibility(View.VISIBLE);
imv.setImageBitmap(result);
}else{
imv.setVisibility(View.GONE);
}
}
}
}
No meu diretório ‘/exemplo/images’ existem apenas as imagens: 1, 2, 3, 4, 6, 7 e 9.
O Resultado esperado é:
[URL=http://imageshack.us/photo/my-images/193/exemc.png/][/URL]
Uploaded with [URL=http://imageshack.us]ImageShack.us[/URL]
Mas quando faço rolo a lista rapidamente, algumas imagens são inseridas nos itens errados. Isso acontece devido ao reaproveitamento
de views do método getView().
Se eu alterar o método da seguinte forma, funciona:
//if(convertView == null){
// view = mInflater.inflate(mResource, null);
//}else{
// view = convertView;
//}
view = mInflater.inflate(mResource, null);
O problema eh que não quero fazer isso, para reaproveitar um Adaptador generico que criei.
Alguem tem uma ideia??
vlww