2016-12-09 7 views
1

Ich versuche, Elemente dynamisch in der Listenansicht auf Schaltfläche klicken mit Hilfe von benutzerdefinierten Array-Adapter hinzuzufügen. Jedes Mal, wenn ich ein neues Element hinzufüge, werden die gesamten Elemente in Standarddaten geändert. Ich habe eine Suchleiste in der Listenansicht, wenn ich den Wert ändere, der in das Dataset reflektiert wird, aber wenn ich ein neues Element in der Benutzeroberfläche neu hinzufüge, wird es auf die Standardwerte zurückgesetzt.Listenansicht wird nicht ordnungsgemäß mit benutzerdefinierten Adapter in UI aktualisiert

public class TextAdapter extends ArrayAdapter<TextDetails> { 

private List<TextDetails> dataSet; 
Context mContext; 
private int lastPosition = -1; 

public TextAdapter(List<TextDetails> td, Context applicationContext) { 
    super(applicationContext,R.layout.list_edit, td); 
    this.dataSet=td; 
    this.mContext=applicationContext; 
} 

private static class ViewHolder { 
    TextView txtName; 
    CrystalRangeSeekbar sk; 
} 
@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    // Get the data item for this position 
    final TextDetails data = getItem(position); 

    // Check if an existing view is being reused, otherwise inflate the view 
    final ViewHolder viewHolder; // view lookup cache stored in tag 

    final View result; 

    if (convertView == null) { 

     viewHolder = new ViewHolder(); 
     LayoutInflater inflater = LayoutInflater.from(getContext()); 
     convertView = inflater.inflate(R.layout.list_edit, parent, false); 
     viewHolder.txtName = (TextView) convertView.findViewById(R.id.tv); 
     viewHolder.sk = (CrystalRangeSeekbar) convertView.findViewById(R.id.skr); 
     result=convertView; 
     convertView.setTag(viewHolder); 
    } else { 
     viewHolder = (ViewHolder) convertView.getTag(); 
     result=convertView; 
    } 

    lastPosition = position; 

    viewHolder.sk.setOnRangeSeekbarChangeListener(new OnRangeSeekbarChangeListener() { 
     @Override 
     public void valueChanged(Number minValue, Number maxValue) { 



     } 
    }); 
    final String[] n = new String[1]; 
    final long[] mn = new long[1]; 
    final long[] mx = new long[1]; 
    viewHolder.sk.setOnRangeSeekbarFinalValueListener(new  OnRangeSeekbarFinalValueListener() { 
     @Override 
     public void finalValue(Number minValue, Number maxValue) { 
      n[0] = (String) viewHolder.txtName.getText(); 
       mn[0] = (long) viewHolder.sk.getSelectedMinValue()/1000; 
      mx[0] = (long) viewHolder.sk.getSelectedMaxValue()/1000; 

      data.setMaxvalue(mx[0]); 
      data.setMinvalue(mn[0]); 
      data.setNam(n[0]); 

      dataSet.set(position,data); 


     } 
    }); 

    viewHolder.txtName.setText(dataSet.get(position).getName()); 
    viewHolder.sk.setMinValue(dataSet.get(position).getMin()); 
    viewHolder.sk.setMaxValue(dataSet.get(position).getMax()); 
    // Return the completed view to render on screen 
     return convertView; 
    } 
} 

Haupttätigkeit:

addnew.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      td.add(new TextDetails("Sample",0,duration)); 
      adapter=new TextAdapter(td,getApplicationContext()); 
        list.setAdapter(adapter); 
        adapter.notifyDataSetChanged(); 

      addBubble(); 

     } 
    }); 

Datenmodell:

public class TextDetails implements Serializable { 

String name; 
long minvalue; 
long maxvalue; 

public TextDetails(String name, long minvalue, long maxvalue) { 
    this.name=name; 
    this.minvalue=minvalue; 
    this.maxvalue=maxvalue; 


} 

public String getName() { 
    return name; 
} 

public long getMin() { 
    return minvalue; 
} 

public long getMax() { 
    return maxvalue; 
} 

public void setNam(String name) { 
    this.name=name; 
} 

public void setMinvalue(long minvalue) { 

    this.minvalue=minvalue; 
} 

public void setMaxvalue(long maxvalue) { 
    this.maxvalue=maxvalue; 
} 



} 
+0

folgen Sie diesem Beispiel: http://stackoverflow.com/questions/41026692/updating-listview-without-dplication/41027195?noredirect=1#comment69298147_41027195 –

Antwort

0

Sie sollten keinen neuen adapter auf jedem Klick eingestellt. Sie sollten dem vorhandenen Adapter Daten hinzufügen und dann notifyDataSetChanged() darauf aufrufen. Ändern Sie nur die adapter, wenn Sie alles an der Liste ändern und es auf den Anfang zurücksetzen möchten, beispielsweise wenn Sie dieselbe Liste verwenden, um zwei verschiedene Datensätze anzuzeigen.

+0

Vielen Dank @Gabe Sechan! Das funktionierte für mich, aber wenn ich den Wert der Suchleiste ändere, die nicht im Datensatz aktualisiert wird! Können Sie bitte überprüfen, wo ich in benutzerdefinierten Adapter falsch mache? –

Verwandte Themen