【问题标题】:RecyclerView display only one value in whole ViewRecyclerView 在整个 View 中只显示一个值
【发布时间】:2020-09-21 12:57:03
【问题描述】:

我想做一个 RecyclerView 来显示来自 api 调用的响应。一切都由 MVVM 和 Retrofit 设置。我的主要斗争是关于适配器类,它基本上在每个文本视图中显示相同的值。响应肯定是正确的(我已经通过记录器检查过)我看到的另一件事是一遍又一遍地复制所有响应(在控制台中)我如何解决它以正确显示响应?

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

【问题讨论】:

    标签: java android mvvm retrofit


    【解决方案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的位置,完成每个位置的代码。位置变量在onBindViewholder中传递给你,这样你就可以区分每个位置。

        Hashmaps 不适用于 recyclerview,因为你不能通过它的位置来分隔 hashmap。在将地图传递给 recyclerview 之前,将其转换为数组列表,然后使用位置变量获取数组列表中的相应位置

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-02-22
          • 1970-01-01
          • 2022-01-03
          相关资源
          最近更新 更多