2010-11-10 11 views
11

sto usando un viewholder per visualizzare da un array dinamico funziona, ma i dati visualizzati cambiano in modo irregolare quando faccio scorrere la lista. Voglio che la mia vista elenco venga popolata una sola volta, non sempre quando faccio scorrere la mia lista. Qualche suggerimento? Ecco il mio codiceCome implementare un titolare della 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;   
} 

quando la lista viene caricato sembra che questo: http://i.stack.imgur.com/NrGhR.pngalt text dopo lo scorrimento di alcuni dati http://i.stack.imgur.com/sMbAD.pngalt text Ecco come si presenta, e di nuovo se ho scorrere fino all'inizio sembra http://i.stack.imgur.com/0KjMa.pngalt text

PS: la mia lista deve essere in ordine alfabetico

+0

puoi postare la schermata della tua uscita? –

+0

@Tilsan The Fighter: hanno pubblicato le istantanee. – Ads

risposta

5

Avresti bisogno di scrivere la tua versione di ListView per farlo (che è male). Se il ListView non funziona correttamente, probabilmente significa che stai facendo qualcosa di sbagliato.

Da dove proviene l'elemento id? Stai ottenendo la posizione nel tuo metodo getView(), quindi non devi preoccuparti di superare i limiti di lista. La posizione è legata alla posizione di elemento nella lista, in modo da poter ottenere l'elemento corretto in questo modo:

myElements.get(position); 

Quando i dati nella lista le modifiche, è possibile chiamare questo:

yourAdapter.notifyDataSetChanged() 

Quello ricostruirà la tua lista con nuovi dati (pur mantenendo il tuo scorrimento e cose).

27

Hai provato questo?

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

Se sì, cosa c'è che non va?

Non penso che caricare tutte le righe contemporaneamente sia una buona idea. Finirai per avere un sacco di viste inutili in memoria che rallenteranno l'applicazione per niente. Le viste e le operazioni sulle viste (come gonfiare, findViewById, getChild ..) sono costose, dovresti cercare di riutilizzarle il più possibile. Ecco perché utilizziamo ViewHolders.

+0

si! ho provato.quando scorrono fino all'ultimo elemento (> 92) non è stato possibile caricare gli elementi in listview! myElement è una lista di array con l'aiuto di id, ottengo ogni elemento da visualizzare in visualizzazione testo. Sì, sembra che sto caricando tutti i dati una volta ma non so come riutilizzarlo, puoi aiutarmi in questo – Ads

Problemi correlati