2010-11-10 6 views
11

estoy usando un visor para mostrar desde un arrayadapter.it dinámico funciona, pero los datos que se muestran cambian irregularmente cuando me desplazo por la lista. Quiero que mi Vista de lista se llene solo una vez, No todo el tiempo cuando me desplazo por mi lista. ¿Alguna sugerencia? Aquí está mi código¿Cómo implementar un titular de vista?

public View getView(int position, View convertView, ViewGroup parent) {    

    // A ViewHolder keeps references to children views to avoid unneccessary calls    
    // to findViewById() on each row.    
    ViewHolder holder;    
    // When convertView is not null, we can reuse it directly, there is no need    
    // to reinflate it. We only inflate a new View when the convertView supplied    
    // by ListView is null.    

    if (convertView == null) {     

    convertView = mInflater.inflate(R.layout.sample, null); 
    // Creates a ViewHolder and store references to the two children views     
    // we want to bind data to.    
    holder = new ViewHolder();     
    holder.name = (TextView) convertView.findViewById(R.id.text);    
    holder.icon = (ImageView) convertView.findViewById(R.id.icon);     
    convertView.setTag(holder);    
    } else {     
    // Get the ViewHolder back to get fast access to the TextView     
    // and the ImageView. 


    holder = (ViewHolder) convertView.getTag(); 

    }    


    // Bind the data efficiently with the holder. 
    if(_first==true) 
    { 
    if(id<myElements.size()) 
    { 
     holder.name.setText(myElements.get(id)); 
    holder.icon.setImageBitmap(mIcon1); 
    id++; 
    } 
    else 
    { 
    _first=false; 
    } 
    } 
    //holder.icon.setImageBitmap(mIcon2); 
    /*try{ 
    if(id<myElements.size()) 
    id++; 
    else 
    { 
     id--; 
    } 
    } 
    catch(Exception e) 
    { 
    android.util.Log.i("callRestService",e.getMessage()); 
    }*/ 



    return convertView; 

    }   
static class ViewHolder {    
TextView name;    
ImageView icon;   
} 

cuando se carga la lista se parece a esto: http://i.stack.imgur.com/NrGhR.pngalt text después de desplazarse algunos datos http://i.stack.imgur.com/sMbAD.pngalt text Parece que este, y otra vez si me desplazo al principio se ve http://i.stack.imgur.com/0KjMa.pngalt text

PD: mi lista debe estar en orden alfabético

+0

¿puede publicar la captura de pantalla de su salida? –

+0

@Tilsan The Fighter: ha publicado las instantáneas. – Ads

Respuesta

5

Tendrá que escribir su propia versión de ListView para hacer eso (lo cual es malo). Si el ListView no funciona correctamente, probablemente significa que está haciendo algo mal.

¿De dónde viene el elemento id? Obtendrá la posición en su método getView(), por lo que no debe preocuparse por exceder los límites de la lista. La posición está vinculada a la posición del elemento en la lista, para que pueda obtener el elemento correcto de esta manera:

myElements.get(position); 

Cuando los datos de su lista son los cambios, puede llamar a esto:

yourAdapter.notifyDataSetChanged() 

Eso reconstruirá su lista con nuevos datos (mientras mantiene su desplazamiento y esas cosas).

27

¿Has probado esto?

public View getView(int position, View convertView, ViewGroup parent) {    

    // A ViewHolder keeps references to children views to avoid unneccessary calls    
    // to findViewById() on each row.    
    ViewHolder holder;    
    // When convertView is not null, we can reuse it directly, there is no need    
    // to reinflate it. We only inflate a new View when the convertView supplied    
    // by ListView is null.    

    if (convertView == null) {     

    convertView = mInflater.inflate(R.layout.sample, null); 
    // Creates a ViewHolder and store references to the two children views     
    // we want to bind data to.    
    holder = new ViewHolder();     
    holder.name = (TextView) convertView.findViewById(R.id.text);    
    holder.icon = (ImageView) convertView.findViewById(R.id.icon);     
    convertView.setTag(holder);    
    } else {     
    // Get the ViewHolder back to get fast access to the TextView     
    // and the ImageView. 


    holder = (ViewHolder) convertView.getTag(); 

    }    


    // Bind the data efficiently with the holder. 
    holder.name.setText(myElements.get(id)); 
    holder.icon.setImageBitmap(mIcon1); 

    return convertView; 
    } 

static class ViewHolder {    
    TextView name;    
    ImageView icon;   
} 

En caso afirmativo, ¿qué hay de malo en ello?

No creo que cargar todas las filas a la vez sea una buena idea. Usted terminará teniendo muchas Vistas inútiles en la memoria que ralentizarán la aplicación por nada. Las vistas y operaciones en las vistas (como inflate, findViewById, getChild ..) son caras, debe intentar reutilizarlas tanto como sea posible. Es por eso que usamos ViewHolders.

+0

¡sí! Lo intenté. Cuando me desplazo al último Elemento (> 92), ¡no podría cargar los elementos en la vista de lista! myElement es un arrayList con la ayuda de id, obtengo todos los elementos para mostrar en la vista de texto. sí, parece que estoy cargando todos los datos una vez, pero no sé cómo volver a utilizarlo, ¿pueden ayudarme en esto? – Ads

Cuestiones relacionadas