我是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/