1

リストビューの日付に日数を追加するメソッドがあります。スクロールして値を変更すると問題が発生し、2種類の日付があるため、メソッドには2番目の種類がリストに表示されたときに呼び出されますが、メソッドを一度使用すれば、スクロールするたびに追加を続けることはできません。getviewで複数回呼び出されたSumメソッド

 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

アダプターのgetView()メソッド(これはたくさん呼ばれる)のaddIntervalo()メソッドを、アダプターのコンストラクターのfaturasItensのすべてのアイテムで呼び出すのではなく、なぜ呼び出すのですか? (とsetData())? – Luksprog

+0

@Luksprogあなたはあなたのアイデアを使って答えを詳述できますか? – AND4011002849

+0

getView()内でそのメソッドを呼び出すべきではありません.getview()はlistview.soをスクロールするときに何度も呼び出すので、これらの値を外部から計算してここにバインドする必要があります。 – malli

答えて

1

私のコメントでは、なぜgetView()メソッドでaddIntervalo()メソッドを呼び出す必要があるのか​​わかりません。この問題は、ユーザーがListViewを使用するときにgetView()が多く呼び出されるため、同じデータを繰り返し追加することになります。あなたのコードから

あなただけ(addIntervaloで計算されたデータを示しているようだ)(私は、各項目はあなたがaddIntervalo(で計算し、そのタイプのために計算し、合計にそのデータを相対的に提示すると仮定している))だから単に値を事前に計算してから、getView()で単純にそれを使用することができます。

// 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()); 
     } 
    } 

また、あなたはまた、アダプタに追加されようとしている新しい項目のためaddIntervalo()の結果を計算する必要があるので、あなたはデータのリストを更新するのsetData()メソッドを持っています

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

すでに値を計算した:getViewメソッドで

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(); 
} 
()の行を削除します。

1

ああ、ベースアンドロイドリストのウィジェットがビューを変更するのは問題です。 ListViewとRecycleViewはキャッシュされ、スクロールごとにビューが無効になることを知っておく必要があります。あなたのビューはデフォルトのタイプに変更されます!

RecycleViewにはソリューションがあり、getItemType()メソッドのいくつかの型を使用しています。しかし、ListViewを使って作業します。とにかく!より良い解決策は、カスタムビューをサポートし、いつでもそのビューを変更する特別なリストウィジェットを使用することです。このタスクのためにLinkedListView!

関連する問題