1

У меня есть метод, который добавляет дни в дату списка, проблема в том, что когда я прокручиваю вниз и вверх, значения меняются, у меня есть 2 вида даты, поэтому метод имеет для вызова, когда второй список появляется в списке, но как я могу использовать метод один раз, чтобы он не добавлял каждый раз, когда я его прокручиваю?Метод sum, вызванный несколько раз в 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

Почему вы вызываете метод addIntervalo() в методе getView() адаптера (который будет называться много) вместо вызова этого метода для каждого элемента в faturasItens в конструкторе адаптера (и setData())? – Luksprog

+0

@ Luksprog вы можете разработать ответ с вашей идеей? – AND4011002849

+0

, вы не должны вызывать этот метод внутри getView(). Поскольку getView() вызывает несколько раз, когда мы прокручиваем listview.so, вы должны использовать эти значения извне и связывать их здесь. – malli

ответ

1

Как я уже сказал в своем комментарии я не понимаю, почему вам нужно вызвать метод addIntervalo() в методе GetView(). Проблема в том, что 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()); 
     } 
    } 

У вас также есть метод УстановитьДанные(), где вы обновляете список данных, так что вы также должны вычислить результат 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

О, это проблема для виджета базового андроида, чтобы изменить вид. Вы должны знать, что кеширование ListView и RecycleView и недействительность просмотров на прокрутку! Итак, ваши взгляды будут изменены на тип по умолчанию!

У RecycleView есть решение, используя несколько методов getItemType(). Но вы работаете с ListView. Так или иначе! Лучшее решение использует специальный виджет списка, который поддерживает пользовательские представления и изменение этих представлений в любое время. Для этой задачи используйте LinkedListView!

Смежные вопросы