#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