2016-06-02 9 views
0

Dies ist der Adapter. Das Verhalten ist wie im Titel beschrieben, wenn ich nach unten scrolle und dann die Reihenfolge der Elemente ändere. Ich kann nicht herausfinden, warum sich die Reihenfolge der Artikel ändern würde.Listenansicht ändert Reihenfolge, wenn ich nach oben und unten scrollen?

import java.util.ArrayList; 
import java.util.List; 
import java.util.Map; 
import java.util.TreeSet; 
import android.content.Context; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.TextView; 

class CustomAdapter extends BaseAdapter { 

    private static final int TYPE_ITEM = 0; 
    private static final int TYPE_SEPARATOR = 1; 

    List<Map<String, String>> mData = new ArrayList<Map<String, String>>(); 
    private TreeSet<Integer> sectionHeader = new TreeSet<Integer>(); 

    private LayoutInflater mInflater; 

    public CustomAdapter(Context context) { 
     mInflater = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

    public void addItem(final Map<String, String> item) { 
     mData.add(item); 
     notifyDataSetChanged(); 
    } 

    public void addSectionHeaderItem(final Map<String, String> item) { 
     mData.add(item); 
     sectionHeader.add(mData.size() - 1); 
     notifyDataSetChanged(); 
    } 

    @Override 
    public int getItemViewType(int position) { 
     return sectionHeader.contains(position) ? TYPE_SEPARATOR : TYPE_ITEM; 
    } 

    @Override 
    public int getViewTypeCount() { 
     return 2; 
    } 

    @Override 
    public int getCount() { 
     return mData.size(); 
    } 

    @Override 
    public String getItem(int position){ 
     return mData.get(position).get("id"); 
    } 

    public String getItemMain(int position) { 
     return mData.get(position).get("id"); 
    } 

    public String getItemSecondary(int position) { 
     return mData.get(position).get("description"); 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder holder = null; 
     int rowType = getItemViewType(position); 

     if (convertView == null) { 
      holder = new ViewHolder(); 
      switch (rowType) { 
       case TYPE_ITEM: 
        convertView = mInflater.inflate(R.layout.snippet_item1, null); 
        holder.textView = (TextView) convertView.findViewById(R.id.text); 
        holder.textView2 = (TextView) convertView.findViewById(R.id.text2); 
        holder.textView.setText(mData.get(position).get("id")); 
        holder.textView2.setText(mData.get(position).get("description")); 
        break; 
       case TYPE_SEPARATOR: 
        convertView = mInflater.inflate(R.layout.snippet_item2, null); 
        holder.textView = (TextView) convertView.findViewById(R.id.textSeparator); 
        holder.textView.setText(mData.get(position).get("id")); 
        //holder.textView.setText(mData.get(position).get("description")); //no sub item yet! 
        break; 
      } 
      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 
     //holder.textView.setText(mData.get(position)); 


     return convertView; 
    } 

    public static class ViewHolder { 
     public TextView textView; 
     public TextView textView2; 
    } 

} 
+0

bewegen alle eingestellten Daten nach 'else' in' getView' Methode. 'convertView == null 'ruf einfach einmal an pre type, damit neue Daten nicht mehr gesetzt werden –

Antwort

0

Sie verwenden das ViewHolder-Muster unvollständig. Wenn currentView! = Null ist, müssen Sie immer noch die Zelleninformationen (Textansichten) aktualisieren, ansonsten verwenden Sie die gleiche wiederverwendbare Ansicht mit den alten geladenen Informationen.

So:

if (currentView == null) { 
    // this is ok 
} else { 
    holder = (ViewHolder) convertView.getTag(); 
    // this is the new stuff 
    holder.textView.setText("blablabla"); 
} 
+0

es ist besser' holder.textView.setText ("blablabla"); 'nach der else-Methode zu verschieben, um doppelten Code in if/else, –

+0

@shayanpourvatan zu verhindern Ich stimme zu, ich würde meinen Code auf eine andere Art und Weise strukturieren als OP .. –

+0

@MatiasElorriaga also, wenn ich den Satztext nach dem verschieben, sonst würde es das stoppen? – AlexF11

Verwandte Themen