java.util.HashMap 无法转换为 java.util.ArrayList

标签 java android firebase

我是android新手,最近我试图从firebase中提取数据到recyclerview/cardview中以垂直布局显示数据,它显示将Hashmap转换为Arraylist的错误,其中代码是:

    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
    recyclerView.setHasFixedSize(true);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    new GetDataFromFirebase().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);

// Read from the database
    FirebaseDatabase database = FirebaseDatabase.getInstance();
    DatabaseReference myRef = database.getReference("0XtzzDme");

    myRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            ArrayList<String> values = (ArrayList<String>) dataSnapshot.getValue();
            recyclerView.setAdapter(new RecyclerViewAdapter(values));
        }

        @Override
        public void onCancelled(DatabaseError error) {
            // Failed to read value
            System.out.println("Failed to read value." + error.toException());
        }
    });
}

recyclerviewadapter

    class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> {
    private ArrayList<String> values;
    RecyclerViewAdapter(ArrayList<String> values) {
       this.values = values;
  }

  @Override
   public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
      return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate( R.layout.recycler_view_item,parent,false));
}

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    holder.name.setText(values.get(position));
}

@Override
public int getItemCount() {
    return values.size();
}

class ViewHolder extends RecyclerView.ViewHolder {
    private TextView name;
    ViewHolder(View itemView) {
        super(itemView);
        name = (TextView) itemView.findViewById(R.id.list_item_text);
    }
  }
}

最佳答案

正如Firebase API所述, DataSnapshot.getValue() 可以返回以下任意值:

  • boolean 值
  • 字符串
  • map <字符串,对象>
  • 列表<对象>

如果出现错误,它显然会返回一个 Map 而不是预期的 List

要解决此问题,您应该回顾一下为什么此时需要一个 List 以及为什么可能返回一个 Map。也许返回 Map 的事实已经是一个错误。

但是,无论您得出什么结论,您很可能必须写出如下内容:

Object value = dataSnapshot.getValue();
if(value instanceof List) {
    List<Object> values = (List<Object>) value;
    // do your magic with values
}
else {
    // handle other possible types
}

关于java.util.HashMap 无法转换为 java.util.ArrayList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42089524/

相关文章:

android - 当没有互联网连接时使用 FCM 发送推送通知

Firebase 存储等待 uploadTask.onComplete 已过时

java - 以有效的方式从文件系统加载 JPanel 子组件集中的图像

java - 如何在 Java 的 Observer 的 update() 中执行不同的操作?

java - 检查权限时应用程序无法转换为 android.app.Activity

android - Google map 在 Genymotion 中报告的 GPS 位置不正确

java - 从 txt 文件读入单个数组 - Java

java - 大量 ".class expected"和 "not a statement"

android - 如何在不同的手机本地化上打开特定链接

swift - 如何通过快照将时间戳(在 firebase Double 或 String 中的 neSTLed)检索为 int 以在 if 语句中使用?