在getview中多次调用的Sum方法

时间:2016-07-02 17:15:01

标签: android android-recyclerview android-arrayadapter android-adapter

我有一个方法在listview的日期添加天,问题是当我向下滚动并再次向上更改值时,我有2种日期,所以该方法必须在第二种时调用出现在列表中,但是如何使用该方法一次,以便每次滚动时都不会添加?

     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;

    }

}

2 个答案:

答案 0 :(得分: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());
        }
    }

您还有setData()方法,您可以在其中更新数据列表,因此您还需要为即将添加到适配器的新项计算addIntervalo()的结果:

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

在getView()中删除行:

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

因为你已经计算了这些值。

答案 1 :(得分:1)

哦,基础android列表的小部件更改视图的问题。 你应该知道,每次滚动时ListView和RecycleView缓存和无效视图!所以你的视图将被更改为默认类型!

RecycleView有解决方案,它使用方法getItemType()中的几种类型。但您使用ListView。无论如何!更好的解决方案是使用特殊列表小部件,它支持自定义视图并随时更改该视图。对于此任务,请使用LinkedListView!