在getview中多次调用Sum方法



我有一个方法,在列表视图的日期添加天,问题是当我向下和向上滚动再次值改变,我有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;
    }
}

正如我在评论中所说,我不明白为什么需要在getView()方法中调用addIntervalo()方法。这样做的问题是,getView()将被调用很多,因为用户使用ListView,所以你最终会一次又一次地添加相同的数据。

从你的代码,似乎你只是显示与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());

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

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

最新更新