Java RecyclerView在整个视图中仅显示一个值
我想制作一个RecyclerView,它将显示api调用的响应。一切都由MVVM设置,并进行改造。我的主要任务是适配器类,它基本上在每个文本视图中显示相同的值。响应确实是正确的(我已经通过记录器检查过了)。我看到的另一件事是一遍又一遍地复制所有响应(在控制台中),我如何解决它以正确显示响应 main活动Java RecyclerView在整个视图中仅显示一个值,java,android,mvvm,retrofit,Java,Android,Mvvm,Retrofit,我想制作一个RecyclerView,它将显示api调用的响应。一切都由MVVM设置,并进行改造。我的主要任务是适配器类,它基本上在每个文本视图中显示相同的值。响应确实是正确的(我已经通过记录器检查过了)。我看到的另一件事是一遍又一遍地复制所有响应(在控制台中),我如何解决它以正确显示响应 main活动 @Override public void onChanged(Map<String, Double> stringDoubleMap) { private
@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);
}
}
@覆盖
更改后的公共void(映射stringDoubleMap){
私有HashMap速率=新HashMap();
如果(rates.size()>0){
费率。清除();
}
如果(!stringDoubleMap.isEmpty()){
价格。putAll(stringDoubleMap);
CurrencyAdapter=新的CurrencyAdapter(费率);
recyclerView.setAdapter(适配器);
}
}
适配器
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());
}
HashMap asd=newhashmap();
公共货币适配器(哈希映射速率){
这是asd=费率;
Log.i(标记“CurrencyAdapter:constructor”+asd.size());
}
@非空
@凌驾
public CurrencyViewHolder onCreateViewHolder(@NonNull ViewGroup父级,int-viewType){
View=LayoutFlater.from(parent.getContext()).flate(R.layout.currency\u项,父项,false);
返回新的CurrencyViewHolder(视图);
}
@凌驾
public void onBindViewHolder(@NonNull CurrencyViewHolder,int位置){
对于(Map.Entry:asd.entrySet()){
System.out.println(entry.getKey());
holder.mNationality.setText(entry.getKey());
holder.mValue.setText(String.valueOf(entry.getValue());
}
Log.i(标记“onBindViewHolder:+asd.size());
}
onBindViewHolder
是为数组中的每个项目分别调用的(注意position
param),因此您不应该在那里自己迭代,只需从HashMap
中获取一个项目,然后在视图上绘制(holder
)不要迭代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());
}
@覆盖
public void onBindViewHolder(@NonNull CurrencyViewHolder,int位置){
Map.Entry=asd.get(位置);
System.out.println(entry.getKey());
holder.mNationality.setText(entry.getKey());
holder.mValue.setText(String.valueOf(entry.getValue());
Log.i(标记“onBindViewHolder:+asd.size());
}
onBindViewholder的工作方式是,它循环遍历recyclerview的位置,并完成每个位置的代码。位置变量在onBindViewholder中传递给您,以便您可以区分每个位置
Hashmaps不能与recyclerview一起使用,因为您不能按位置分隔hashmap。在将地图传递给recyclerview之前,将其转换为arraylist,然后使用position变量获取arraylist中的相应位置