java.util.HashMap cannot be cast to java.util.ArrayList
我是android的新手,最近我试图从firebase中提取数据到recyclerview / cardview以垂直布局显示数据,它显示了将Hashmap转换为Arraylist的错误,其中代码是:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | 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()); } }); } |
和
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | 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所述,
- 布尔
- 串
- 长
- 双
-
Map
- 列表<对象>
如果出现错误,它显然会返回
要解决这个问题,您应该回避为什么在此时期望
然而,无论你得出什么结论,你很可能必须写下这样的东西:
1 2 3 4 5 6 7 8 |
请使用下面的代码将HashMap转换为ArrayList,您可以在您的情况下将String更改为File。
1 2 3 4 5 6 7 8 9 10 11 |
SO上有大量的线程如何将Map转换为列表(例如这里)。
最可能的答案是存储在数据库中的项是具有公共属性的对象,而不是基本字符串或其他基本数据类型。
除非您能够显示输入数据库的内容,否则很难知道。
例如,如果您有一个对象
然后你可能会得到一个带有单个键"text"的地图和来自getText()的相应值
如果您有一个存储了具有字符串数组的项目
1 2 3 4 5 |
那么你的快照可能包含一个带有键"item"的地图,其值可能是你期望的字符串列表。
有一个谷歌的Java bean约定,它可能会有所帮助。
it is showing the error of converting Hashmap to Arraylist
您的代码中没有转换,这正是问题所在。您正在尝试将HashMap转换为ArrayList,而不是。可能阅读可能阅读2
转换一个将通过以下方式完成:
1 | ArrayList<String> values = new ArrayList<>((HashMap<String, Object>) dataSnapshot.getValue()).values(); |
像这样将Hashmap转换为数组列表..
1 | List<String> list = new ArrayList<String>(theHashMap.values()); //Most likely dataSnapshot.getValues() |