2010-11-10 23 views
11

Ich verwende einen Viewholder zur Anzeige von einem dynamischen Arrayadapter.it funktioniert, aber die angezeigten Daten ändert sich unregelmäßig, wenn ich die Liste scrollen. Ich möchte, dass meine Listenansicht nur einmal ausgefüllt wird. Nicht immer, wenn ich meine Liste durchblättere. Irgendwelche Vorschläge? Hier ist mein CodeWie implementiert man einen Ansichtshalter?

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

, wenn die Liste geladen wird es wie folgt aussieht: http://i.stack.imgur.com/NrGhR.pngalt text nach ein paar Daten Scrolling http://i.stack.imgur.com/sMbAD.pngalt text sieht es so aus, und wieder, wenn ich an den Anfang blättern sieht es http://i.stack.imgur.com/0KjMa.pngalt text

PS: meine Liste muss in alphabetischer Reihenfolge sein

+0

können Sie den Screenshot Ihrer Ausgabe posten? –

+0

@Tilsan Der Kämpfer: habe die Schnappschüsse gepostet. – Ads

Antwort

5

Sie müssten Ihre eigene Version von ListView schreiben, um das zu tun (was schlecht ist). Wenn die ListView nicht richtig funktioniert, bedeutet es wahrscheinlich, dass Sie etwas falsch machen.

Woher kommt das id Element? Sie erhalten die Position in Ihrer getView()-Methode, sodass Sie sich keine Gedanken über das Überschreiten von Listengrenzen machen müssen. Die Position wird in der Liste mit dem Element Position verknüpft, so dass Sie das richtige Element wie folgt erhalten:

myElements.get(position); 

Wenn die Daten in der Liste ändert, können Sie dies nennen:

yourAdapter.notifyDataSetChanged() 

That wird deine Liste mit neuen Daten neu aufbauen (während du dein Scrolling und so weiter behältst).

27

Haben Sie das versucht?

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

Wenn ja, was ist daran falsch?

Ich glaube nicht, alle Zeilen auf einmal laden ist eine gute Idee. Sie werden am Ende viele nutzlose Ansichten im Speicher haben, die die Anwendung für nichts verlangsamen werden. Ansichten und Operationen auf Ansichten (wie z. B. aufblasen, findViewById, getChild ..) sind teuer, Sie sollten versuchen, sie so oft wie möglich wiederzuverwenden. Deshalb verwenden wir ViewHolder.

+0

ja! Ich habe es versucht. Wenn ich zum letzten Element blättern (> 92), konnte es die Elemente in ListView nicht laden! myElement ist eine ArrayList mit Hilfe von ID, ich bekomme jedes Element in der Textansicht angezeigt. Ja, es scheint, ich lade alle Daten einmal, aber ich weiß nicht, wie ich es wiederverwenden kann, können Sie bitte dabei helfen – Ads

Verwandte Themen