我是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);
}
}
}
答案 0 :(得分:6)
正如Firebase API所述,DataSnapshot.getValue()
可以返回以下任意内容:
如果您的错误显然会返回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
}
答案 1 :(得分:4)
请使用以下代码将HashMap转换为ArrayList,您可以在您的情况下将String更改为File。
//Creating a HashMap object
HashMap<String, String> map = new HashMap<String, String>();
//Getting Collection of values from HashMap
Collection<String> values = map.values();
//Creating an ArrayList of values
ArrayList<String> listOfValues = new ArrayList<String>(values);
答案 2 :(得分:2)
HashMap
和ArrayList
是两种完全不同的数据类型。
HashMap
是Map
接口的实现,它存储键:值对
ArrayList
是List
接口的实现,用于存储项目列表
SO上有很多线程如何将地图转换为列表(例如here)。
答案 3 :(得分:1)
将Hashmap转换为数组列表......
List<String> list = new ArrayList<String>(theHashMap.values()); //Most likely dataSnapshot.getValues()
答案 4 :(得分:1)
显示将Hashmap转换为Arraylist的错误
您的代码中没有转换,这正是问题所在。您正在尝试将HashMap转换为ArrayList,而不是。 Possible reading Possible reading 2
转换一个将通过以下方式完成:
ArrayList<String> values = new ArrayList<>((HashMap<String, Object>) dataSnapshot.getValue()).values();
答案 5 :(得分:1)
最可能的答案是存储在数据库中的项目是具有公共属性的对象,而不是基本字符串或其他基础数据类型。
除非您能够显示输入数据库的内容,否则很难知道。
例如,如果您有一个对象
class Item {
private String text;
public String getText();
public void setText(String);
}
然后你可能会拿出一个带有单个键“text”的地图和来自getText()的相应值
如果您存储的项目包含字符串数组
class Example {
private list<String> items;
public String getItem(int);
public int getItemCount()
}
然后您的快照可能包含一个带有键“item”的地图,其值可能是您期望的字符串列表。
有一个谷歌的Java bean约定,它可能有帮助。