2017-02-07 2 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

Потому что они не могут, они не являются типом данных типа. Один - это карта, другой - это список – AxelH

+0

. Нет никакого кода для hashmap, поэтому я разместил здесь вопрос – user3921943

+3

@ user3921943; В этом-то и дело. 'dataSnapshot.getValue()' возвращает 'HashMap', пока вы пытаетесь справиться с ним как' ArrayList'. Это похоже на то, что ты купил птицу, а на самом деле это корова; Это не сработает ... – 0xDEADC0DE

ответ

5

Как заявил Firebase API, DataSnapshot.getValue() может вернуть любой из:

  • Boolean
  • Строка
  • Long
  • Двухместный
  • Карта < String, Object >
  • Список < Объект >

В случае вашей ошибки, очевидно, возвращает 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 (класс ).' Поэтому generic используется только здесь ... – AxelH

+0

Да, и это абсолютно другой кусок пирога, потому что этот метод сортировка конструктора по умолчанию. Как сказано в документации, он формирует экземпляр класса, реализация которого в основном эквивалентна ожидаемой структуре. Следовательно, нет никакой возможности получить «Список». – 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

HashMap и ArrayList две совершенно разные типы данных.

HashMap является реализацией интерфейса Map, который хранит ключ: значение пара

ArrayList является реализацией интерфейса List, который хранит список элементов

Есть тонны Нити на SO, как конвертировать a Карта к списку (например, 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 на основе Java, которые могут помочь.

Смежные вопросы