Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java RecyclerView在整个视图中仅显示一个值_Java_Android_Mvvm_Retrofit - Fatal编程技术网

Java RecyclerView在整个视图中仅显示一个值

Java RecyclerView在整个视图中仅显示一个值,java,android,mvvm,retrofit,Java,Android,Mvvm,Retrofit,我想制作一个RecyclerView,它将显示api调用的响应。一切都由MVVM设置,并进行改造。我的主要任务是适配器类,它基本上在每个文本视图中显示相同的值。响应确实是正确的(我已经通过记录器检查过了)。我看到的另一件事是一遍又一遍地复制所有响应(在控制台中),我如何解决它以正确显示响应 main活动 @Override public void onChanged(Map<String, Double> stringDoubleMap) { private

我想制作一个RecyclerView,它将显示api调用的响应。一切都由MVVM设置,并进行改造。我的主要任务是适配器类,它基本上在每个文本视图中显示相同的值。响应确实是正确的(我已经通过记录器检查过了)。我看到的另一件事是一遍又一遍地复制所有响应(在控制台中),我如何解决它以正确显示响应

main活动

@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中的相应位置