RecyclerView отображает только одно значение во всем представлении

#java #android #mvvm #retrofit

#java #Android #mvvm #модернизация

Вопрос:

Я хотел создать RecyclerView, который будет отображать ответ от вызова api. Все настраивается MVVM и модифицируется. Моя основная проблема связана с классом адаптера, он в основном отображает одни и те же значения в каждом текстовом представлении. Ответ точно правильный (я проверил его с помощью регистратора) еще одна вещь, которую я видел, — это копирование всего ответа снова и снова (в консоли) как я могу решить это, чтобы правильно отобразить ответ?

MainActivity

 @Override
        public void onChanged(Map<String, Double> stringDoubleMap) {

    private HashMap<String, Double> rates = new HashMap<>();


            if (rates.size() > 0){
                rates.clear();
            }
            if (!stringDoubleMap.isEmpty()){
                rates.putAll(stringDoubleMap);
                CurrencyAdapter adapter = new CurrencyAdapter(rates);
                recyclerView.setAdapter(adapter);
            }
        }
  

Адаптер

 HashMap<String, Double> asd = new HashMap();

public CurrencyAdapter(HashMap<String, Double> rates){
    this.asd = rates;
    Log.i(TAG, "CurrencyAdapter: constructor " asd.size());
}

@NonNull
@Override
public CurrencyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.currency_item, parent, false);
    return new CurrencyViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull CurrencyViewHolder holder, int position) {

    for (Map.Entry<String, Double> entry : asd.entrySet()){
        System.out.println(entry.getKey());
        holder.mNationality.setText(entry.getKey());
        holder.mValue.setText(String.valueOf(entry.getValue()));

    }
    Log.i(TAG, "onBindViewHolder: " asd.size());
}
  

Ответ №1:

Не перебирайте все элементы в onBindViewHolder , так как он вызывается отдельно только для одного элемента каждый раз, когда он вызывается.

Итак, замените onBindViewHolder на

 @Override
public void onBindViewHolder(@NonNull CurrencyViewHolder holder, int position) {
    Map.Entry<String, Double> entry  = asd.get(position);
    System.out.println(entry.getKey());
    holder.mNationality.setText(entry.getKey());
    holder.mValue.setText(String.valueOf(entry.getValue()));

    Log.i(TAG, "onBindViewHolder: "   asd.size());
}
  

Ответ №2:

onBindViewHolder вызывается для каждого элемента в вашем массиве отдельно (обратите position внимание на параметр), поэтому вам не следует выполнять итерацию самостоятельно, просто возьмите один элемент из вашего HashMap и нарисуйте View ( holder )

Ответ №3:

способ работы onBindViewHolder заключается в том, что он перебирает позиции recyclerview и завершает код для каждой позиции.Переменная position передается вам в onBindViewHolder, чтобы вы могли различать каждую позицию.

Хэш-карты не работают с recyclerview, потому что вы не можете разделить хэш-карту по ее положению. Перед передачей вашей карты в recyclerview превратите ее в arraylist, а затем используйте переменную position, чтобы получить соответствующую позицию в вашем arraylist