关于android:java.util.HashMap不能转换为java.util.ArrayList

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());
        }
    });
}

recyclerviewadapter

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所述,DataSnapshot.getValue()可以返回以下任何内容:

  • 布尔
  • Map
  • 列表<对象>

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

要解决这个问题,您应该回避为什么在此时期望List以及可能返回Map的原因。也许返回Map的事实已经是一个错误。

然而,无论你得出什么结论,你很可能必须写下这样的东西:

1
2
3
4
5
6
7
8
Object value = dataSnapshot.getValue();
if(value instanceof List) {
    List<Object> values = (List<Object>) value;
    // do your magic with values
}
else {
    // handle other possible types
}


请使用下面的代码将HashMap转换为ArrayList,您可以在您的情况下将String更改为File。

1
2
3
4
5
6
7
8
9
10
11
//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);


HashMapArrayList是两种完全不同的数据类型。

HashMapMap接口的实现,它存储键:值对

ArrayListList接口的实现,它存储项目列表

SO上有大量的线程如何将Map转换为列表(例如这里)。


最可能的答案是存储在数据库中的项是具有公共属性的对象,而不是基本字符串或其他基本数据类型。

除非您能够显示输入数据库的内容,否则很难知道。

例如,如果您有一个对象

1
2
3
4
5
class Item {
  private String text;
  public String getText();
  public void setText(String);
}

然后你可能会得到一个带有单个键"text"的地图和来自getText()的相应值

如果您有一个存储了具有字符串数组的项目

1
2
3
4
5
class Example {
  private list<String> items;
  public String getItem(int);
  public int getItemCount()
}

那么你的快照可能包含一个带有键"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()