2017-02-07 46 views
0

我是新来的android和最近我试图从firebase提取数据到recyclerview/cardview显示垂直布局的数据,它显示的错误转换HashMap来ArrayList中,其中的代码是:java.util.HashMap不能转换为java.util.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); 
    } 
    } 
} 
+5

因为他们不能,他们是不一样的数据类型。一个是Map,另一个是List – AxelH

+0

这里没有任何hashmap的代码,这就是为什么我在这里发布的问题 – user3921943

+3

@ user3921943;这才是重点。 'dataSnapshot.getValue()'在你试图将它作为'ArrayList'处理时返回'HashMap'。这就像说你买了一只鸟,而它实际上是一头牛;它不会工作... – 0xDEADC0DE

回答

5

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

@AxelH DataSnapShot不有泛型,只有少数几种方法。 – Tom

+0

@Tom的确,现在只是注意到这只是与'getValue(类类型)一起使用'所以通用只在这里使用...... – AxelH

+0

是的,这是一个完全不同的小菜一碟,因为该方法是一些一些默认的结构构建器。正如它在文档中所说的那样,它封送了一个类的实例,该类的实现基本上等同于期望的结构。因此,没有机会从其中获取“List”。 – Izruo

4

请使用下面的代码来HashMap中转换为ArrayList中,您可以更改字符串在你的案件档案。

//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); 
1

转换你HashMap来数组列表一样的..

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

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

HashMapMap接口存储密钥的执行情况:值对

ArrayListList接口的实现存储项目

有吨线程对SO如何转换列表地图到列表(例如here)。

1

它显示转换HashMap来的ArrayList

的错误。在你的代码中没有转换,而这正是问题。你正在试图将一个HashMap转换为一个ArrayList,而不是。 Possible readingPossible reading 2

将一个将这样做:

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

我假设dataSnapshot.getValue()返回一个HashMap(因为错误措辞) –

+0

@Tom所以dataSnapshot是HashMap本身? –

+0

正在看他的代码,看看这种类型是否真的在那里:) –

1

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

很难知道,除非你能显示什么是放入数据库。

举例来说,如果你有一个对象

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

的数组,然后你的快照可能包含一键“项”和该值的地图可能是一个字符串是你期待的名单。

有一个谷歌Java bean的约定,它可能会帮助。

相关问题