Comportamiento inesperado de getView () de CustomAdapter
Estoy teniendo unViewHolder
clase como esta
static class ViewHolder {
protected String fileName;
protected Bitmap bitmap = null;
protected CheckBox checkBox;
protected int position;
protected int resourceId = 0;
protected ImageView imageView;
protected TextView textView;
}
y dentro de migetView()
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final ViewHolder viewHolder;
if(convertView != null)
{
ViewHolder holder = (ViewHolder) convertView.getTag();
if(!holder.fileName.equals(fileList.get(position)))
convertView = null;
}
if(convertView == null)
{
convertView = inflater.inflate(R.layout.image_layout, null, false);
viewHolder = new ViewHolder();
viewHolder.imageView = (ImageView) convertView.findViewById(R.id.imageView);
viewHolder.textView = (TextView) convertView.findViewById(R.id.text);
// Set viewHolder attributes
viewHolder.position = position;
viewHolder.fileName = fileList.get(position);;
// set the checkbox
viewHolder.checkBox = (CheckBox) convertView.findViewById(R.id.checkBox);
// Set the path of the file
final String filePath = context.getBasePath(position);
if(new File(filePath).isDirectory())
{
viewHolder.imageView.setImageResource(R.drawable.folder);
viewHolder.resourceId = R.drawable.folder;
}
else
{
String mimeType = Utility.getMimeType(filePath);
if(mimeType.contains("image"))
{
loadImage(viewHolder, viewHolder.imageView, filePath);
}
else
viewHolder.resourceId = handleFile(viewHolder.imageView, filePath);
}
convertView.setTag(viewHolder);
}
else
{
viewHolder = (ViewHolder) convertView.getTag();
if(viewHolder.bitmap == null)
viewHolder.imageView.setImageResource(viewHolder.resourceId);
else
viewHolder.imageView.setImageBitmap(viewHolder.bitmap);
}
viewHolder.checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton checkBox, boolean checked) {
viewHolder.checkBox.setChecked(checked);
listener.onFileStateChanged(viewHolder.position, checked);
}
});
// set the fileName
viewHolder.textView.setText(viewHolder.fileName);
if(checkBoxVisibility)
viewHolder.checkBox.setVisibility(View.VISIBLE);
else
viewHolder.checkBox.setVisibility(View.INVISIBLE);
return convertView;
}
Y en este momento el cuando actualizo el adaptador usandonotifydatasetChanged()
sin cambiar los datos, laViewHolder
que recibo llamandogetTag()
estaba devolviendo etiquetas equivocadas. Estaba funcionando como
Si la posición es 1, el objeto titular era de la vista en la posición 0. es decir; el objeto anterior fue devuelto ..
Atlast encontré unenviar
que no es lo mismo pero con el mismo método y la solución funciona para mí .. No sé cómo ...
La solucion fue
estableciendo el ancho deListView
aMATCH_PARENT
en xml, en el post estabaheight
.
¿Alguien sabe, cuál es la razón de tal comportamiento? No hay lógica que pueda encontrar detrás de este problema