1

Ich habe eine Methode, die Tage in das Datum der ListView hinzufügen, das Problem ist, wenn ich scroll nach unten und oben wieder die Werte geändert werden, habe ich 2 Arten von Datum, so dass die Methode hat aufgerufen werden, wenn die zweite Art in der Liste erscheint, aber wie kann ich die Methode einmal verwenden, damit sie nicht jedes Mal neu hinzugefügt wird, wenn ich sie durchblättere?Sum-Methode mehrmals aufgerufen in getview

 public class FaturasAdapter extends ArrayAdapter<Faturas> { 

    private Activity activity; 
    private LayoutInflater inflater; 
    private List<Faturas> faturasItens; 
    private Ferramentas mFerramentas; 
    private String entrada; 
    private String parcela = ""; 
    private Map<Integer, Integer> intervaloMap; 
    private String data =""; 


    public FaturasAdapter(Activity activity, RealmList<Faturas> inItems) { 
     super(activity, R.layout.faturas_adapter, inItems); 

     this.activity = activity; 
     this.faturasItens = inItems; 
     this.mFerramentas = new Ferramentas(); 
     this.intervaloMap = new HashMap<Integer, Integer>(); 

    } 


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

    @Override 
    public Faturas getItem(int location) { 
     return faturasItens.get(location); 
    } 

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

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

     View vi = convertView; 
     final ViewHolder holder; 
     final Faturas mFaturas = faturasItens.get(position); 

     if (inflater == null) 
      inflater = (LayoutInflater) activity 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     if (convertView == null) { 

      vi = inflater.inflate(R.layout.faturas_adapter, null); 
      holder = new ViewHolder(); 

      holder.numero = (TextView) vi.findViewById(R.id.numero); 
      holder.intervalo = (TextView) vi.findViewById(R.id.intervalo); 
      holder.valor = (TextView) vi.findViewById(R.id.valor); 
      holder.data = (TextView) vi.findViewById(R.id.data); 

      vi.setTag(holder); 




     } else { 
      holder = (ViewHolder) vi.getTag(); 
     } 
     addIntervalo(mFaturas.getIntervalo(), mFaturas.getTipo()); 
     data = mFerramentas.dataText(intervaloMap.get(mFaturas.getTipo())); 
     holder.intervalo.setText(String.valueOf(mFaturas.getIntervalo())); 

     if (mFaturas.getTipo() == Faturas.intervaloConstanteEntrada) { 
      entrada = "ENT - "; 
      holder.numero.setText(entrada + mFaturas.getOrder() + "/" + mFaturas.getQtParcelasEntrada()); 
      holder.valor.setText(String.valueOf(mFaturas.getValor()) + " "); 

     } else { 
      parcela = "PAR - "; 
      holder.numero.setText(parcela + mFaturas.getOrder() + "/" + mFaturas.getQtParcela()); 
      holder.valor.setText(String.valueOf(mFaturas.getValor()) + " "); 

     } 

     holder.data.setText(data); 
     return vi; 
    } 


    private void addIntervalo(int intervalo, int tipo) { 
     int intervaloSum = intervalo; 

     if (!intervaloMap.isEmpty()) { 
      if (intervaloMap.get(tipo) != null) 
       intervaloSum += intervaloMap.get(tipo); 
     } 

     intervaloMap.put(tipo, intervaloSum); 

    } 

    public List<Faturas> getfaturasItens() { 
     return faturasItens; 
    } 

    public void setData(List<Faturas> fat) { 
     this.faturasItens.addAll(fat); 
     this.notifyDataSetChanged(); 
    } 

    public class ViewHolder { 
     TextView numero; 
     TextView intervalo; 
     TextView data; 
     TextView valor; 

    } 

} 
+0

Warum rufen Sie die addIntervalo() -Methode in der getView() -Methode des Adapters (die viel aufgerufen werden soll), anstatt diese Methode für jedes Element in faturasItens im Konstruktor des Adapters aufzurufen (und setData())? – Luksprog

+0

@Luksprog können Sie eine Antwort mit Ihrer Idee erarbeiten? – AND4011002849

+0

Sie sollten diese Methode nicht innerhalb von getView() aufrufen, da getView() mehrere Male aufruft, wenn wir in listview.scrollen. Also sollten Sie diese Werte von außen berechnen und hier binden. – malli

Antwort

1

Wie gesagt ich in meinem Kommentar, den ich sehe nicht, warum Sie die addIntervalo() -Methode in der getView() Methode aufrufen, tun müssen. Das Problem dabei ist, dass getView() oft aufgerufen wird, da der Benutzer die ListView verwendet, so dass Sie die gleichen Daten immer wieder hinzufügen.

Aus Ihrem Code scheint es, dass Sie nur die mit addIntervalo() berechneten Daten anzeigen (ich nehme an, dass jedes Element seine Daten relativ zu der Summe darstellt, die Sie für den Typ berechnen, den Sie mit addIntervalo() berechnen) könnte einfach vorher die Werte berechnen und dann in getView() einfach das verwenden.

// in the constructor you get the data so calculate the values 
// iterating over the data 
public FaturasAdapter(Activity activity, RealmList<Faturas> inItems) { 
     super(activity, R.layout.faturas_adapter, inItems); 

     this.activity = activity; 
     this.faturasItens = inItems; 
     this.mFerramentas = new Ferramentas(); 
     this.intervaloMap = new HashMap<Integer, Integer>(); 
     foreach(Faturas f : inItems) { 
      addIntervalo(f.getIntervalo(), f.getTipo()); 
     } 
    } 

Sie haben auch die setData() -Methode, wo Sie die Datenliste aktualisieren, so dass Sie auch das Ergebnis der addIntervalo() für die neuen Elemente berechnen müssen, die im Begriff sind, mit dem Adapter hinzugefügt werden:

public void setData(List<Faturas> fat) { 
    // because you're adding the fat list to the current set of items 
    // simply calculate addIntervalo() for them to add their count to the total 
    foreach(Faturas f : fat) { 
     addIntervalo(f.getIntervalo(), f.getTipo()); 
    } 
    this.faturasItens.addAll(fat); 
    this.notifyDataSetChanged(); 
} 

In getView() entfernen Sie die Zeile:

addIntervalo(mFaturas.getIntervalo(), mFaturas.getTipo()); 

wie Sie bereits die Werte berechnet.

1

Oh, es ist ein Problem für Widget Basis Widget Android zu ändern. Sie sollten wissen, dass ListView und RecycleView die Caching- und Invalidierungsansichten per Scrolling speichern! So werden Ihre Ansichten auf den Standardtyp geändert!

RecycleView hat eine Lösung, die mehrere Methoden der Methode getItemType() verwendet. Aber Sie arbeiten mit ListView. Sowieso! Bessere Lösung ist das spezielle Listen-Widget, das benutzerdefinierte Ansichten unterstützt und diese Ansichten jederzeit ändert. Für diese Aufgabe verwenden Sie LinkedListView!

Verwandte Themen