2016-07-08 5 views
1

AdapterListview Android druckt die gleichen Elemente viele Zeit

import ...; 
public class CustomAdapter extends ArrayAdapter<MyObject> { 
    public CustomAdapter(Context context, ArrayList<MyObject> objects) { 
     super(context, 0, objects); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     LayoutInflater inflater = LayoutInflater.from(getContext()); 
     View view1 = inflater.inflate(R.layout.row, parent, false); 

     MyObject myobj = getItem(position); 
     String objectName = myobj.getName(); 

     TextView name_TV = (TextView) view1.findViewById(R.id.name); 
     name_TV.setText(objectName); 
     return view1; 
    } 
} 

MainActivity

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    ArrayList <MyObject> obj_list = new ArrayList<MyObject>(); 
    obj_list.add(new MyObject("user1", 123)); 
    obj_list.add(new MyObject("user2", 123)); 
    obj_list.add(new MyObject("user3", 123)); 

    CustomAdapter adptr = new CustomerAdapter(this, obj_list); 
    ListView lv = (ListView) findViewById(R.id.abcListview); 
    lv.setAdapter(adptr); 
} 

MyObject Klasse

public class MyObject{ 
    String a; 
    int b; 
    public MyObject(String a, int b){ 
     this.a = a; 
     this.b = b; 
    } 
    public String getName(){ 
     return a; 
    } 
} 

Der Code wird 3 Listenansicht Artikel und die "user3" drucken dreimal statt einmal "user1", einmal "user2", einmal "user3".

bearbeiten Ergebnis des obigen Code: http://imgur.com/BBJS0wt

+1

(1) Bitte verwenden Sie RecyclerView (2) Wenn Sie sich weigern, Verwenden Sie RecyclerView mindestens convertView-Parameter verwenden (3) Code der MyObject-Klasse –

+0

@GregEnnis Ich habe den Code der Klasse MyObject hinzugefügt. Ich bin neu in Android-Programmierung, ich weiß nicht, was RecyclerView ist – szz

+0

Versuchen Sie, den CustomAdapter adptr zu erstellen und festzulegen, bevor Sie der ArrayList Objekte hinzufügen. Fügen Sie dann Ihre Objekte zu Ihrer ArrayList hinzu und verwenden Sie lv.notifyDataSetChanged(). Und sehen Sie, ob es das Gleiche tut. – Rob

Antwort

1

Sie sollten die ViewHolder Paradigma verwenden.

EDITED

Das Problem in Ihrem getView() ist, versuchen Sie dies:

public static class ViewHolder { 

public TextView name; 

} 
MyObject myobj; 

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

    View view1 = convertView; 
    ViewHolder holder; 

    if (null == view1) { 

    holder = new ViewHolder(); 
    LayoutInflater inflater = LayoutInflater.from(getContext()); 
    view1 = inflater.inflate(R.layout.row, parent, null); 

    holder.name = (TextView) view1.findViewById(R.id.name); 

    view1.setTag(holder); 

    } 
    else 
    holder = (ViewHolder) view1.getTag(); 

    myobj = getItem(position); 
    if (myobj == null) 
     return view1; 

    String objectName = myobj.getName(); 
    holder.name.setText(objectName); 

    return view1; 

} 

Hope this helfen

+0

Ich denke, die 'Rückkehr view1' sollte nach der else Klammer sein. Mit deinem Code bin ich das Ergebnis, das ich bekomme: "user3", "New text", "New text". ("Neuer Text" ist der Standardwert) – szz

+0

@szz Ich habe die Antwort bearbeitet :) –

+0

Aber ich würde vorschlagen, dass Sie 'RecyclerView' anstelle von' ListView' verwenden. Sehen Sie dies für weitere Informationen [Erste Schritte mit RecyclerView und CardView auf Android] (http://code.utsplus.com/tutorials/getting-started-with-recyclerview-and-cardview-on-android--cms-23465) –

Verwandte Themen