如何解决RecyclerView在整个View中仅显示一个值
我想制作一个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());
}
解决方法
不要遍历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());
}
,
onBindViewHolder
会分别为数组中的每个项目调用(请注意position
参数),因此您不应该在那里自己迭代,只需从HashMap
中获得一项并依靠View
(holder
)
onBindViewholder的工作方式是循环浏览recyclerview的位置并完成每个位置的代码。position变量在onBindViewholder中传递给您,以便您可以区分每个位置。
哈希图无法与recyclerview一起使用,因为您无法按其位置分开哈希图。在将地图传递给recyclerview之前,将其转换为arraylist,然后使用position变量获取arraylist中的相应位置
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。