【问题标题】:java.util.HashMap cannot be cast to java.util.ArrayListjava.util.HashMap 不能转换为 java.util.ArrayList
【发布时间】:2023-03-29 23:30:01
【问题描述】:

我是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);
    }
  }
}

【问题讨论】:

  • 因为它们不能,所以它们不是相同类型的数据。一个是 Map,另一个是 List
  • hashmap 没有任何代码,这就是我在这里发布问题的原因
  • @user3921943;这才是重点。 dataSnapshot.getValue() 返回 HashMap,而您尝试将其作为 ArrayList 处理。这就像说你买了一只鸟,而它实际上是一头牛;它不会工作......

标签: java android firebase


【解决方案1】:

正如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
}

【讨论】:

  • @AxelH DataSnapShot 没有泛型,只有一些方法。
  • @Tom,确实,现在才注意到这仅与 getValue(Class&lt;T&gt; type) 一起使用,因此泛型仅用于此处...
  • 是的,这是完全不同的一块蛋糕,因为该方法是某种默认的结构构建器。正如它在文档中所说,它编组了一个类的实例,其实现基本上等同于预期的结构。因此,没有机会从中获得List
  • 我认为 Izruo 已经解决了这个问题“..也许返回 Map 的事实已经是一个错误..”为什么来自 Firebase 的(可能)简单 JSON 文件被返回为一张地图。我有同样的问题,数据库是由字符串组成的。
  • @Izruo 我们如何循环对象以获取值
【解决方案2】:

请使用以下代码将 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);

【讨论】:

    【解决方案3】:

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

    HashMap 是存储键值对的Map 接口的实现

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

    关于如何将地图转换为列表(例如here)的主题很多。

    【讨论】:

      【解决方案4】:

      像这样将你的 Hashmap 转换为数组列表..

      List<String> list = new ArrayList<String>(theHashMap.values()); //Most likely dataSnapshot.getValues()
      

      【讨论】:

        【解决方案5】:

        显示将Hashmap转换为Arraylist的错误

        您的代码中没有转换,这正是问题所在。您正在尝试将 HashMap 转换为 ArrayList,但事实并非如此。 Possible readingPossible reading 2

        转换一个将通过以下方式完成:

        ArrayList<String> values = new ArrayList<>((HashMap<String, Object>) dataSnapshot.getValue()).values();
        

        【讨论】:

        • 我假设 dataSnapshot.getValue() 返回一个 HashMap(因为错误的措辞)
        • @Tom 所以 dataSnapshot 就是 HashMap 本身?
        • 正在查看他的代码以查看该类型是否确实存在:)
        • 你可以使用getValues(Class&lt;T&gt; valueType) 方法,而不是使用这个演员表,这样会更干净(我相信)
        • 那还需要了解HashMap的类型吗?
        【解决方案6】:

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

        除非您能显示将什么放入数据库,否则很难知道。

        例如,如果你有一个对象

        class Item {
          private String text;
          public String getText();
          public void setText(String);
        }
        

        那么你可能会得到一个带有单个键“文本”的地图以及来自 getText() 的相应值

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

        class Example {
          private list<String> items;
          public String getItem(int);
          public int getItemCount()
        }
        

        那么您的快照可能包含一个带有键“item”的映射,其值可能是您期望的字符串列表。

        有一个 Java bean 约定的 Google 可能会有所帮助。

        【讨论】:

          猜你喜欢
          • 2018-05-17
          • 1970-01-01
          • 1970-01-01
          • 2020-12-20
          • 2013-07-11
          • 2018-02-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多