2017-02-07 11 views
0

私はアンドロイドには新しく、最近firebaseからrecyclerview/cardviewにデータを抽出して縦方向のレイアウトでデータを表示しようとしました。コードがどこにあるか、ArrayListにHashMapを変換: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

これはできないため、これらは同じ種類のデータではありません。 1つはマップ、もう1つはリスト – AxelH

+0

ハッシュマップのコードはありません。その理由はここに投稿しました – user3921943

+3

@ user3921943;それがポイントです。 'dataSnapshot.getValue()'は 'ArrayList'として扱う際に' HashMap'を返します。それは実際に牛である間にあなたが鳥を買ったということのようです。それは動作しません... – 0xDEADC0DE

答えて

5

  • ブール
  • 文字列
  • ロング
  • ダブル
  • 地図<文字列、オブジェクト>
  • リスト、それは明らかに代わりに期待ListMapを返すあなたのエラーの場合は<オブジェクト>

この問題を解決するには、なぜその時点で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(Class type)'でのみ使用されていることに気がつきましたので、genericはここでのみ使用されています... – AxelH

+0

はい、それは全く別のケーキです。デフォルトの構造ビルダーの一種。ドキュメントでは、実装が基本的に期待される構造体と同等であるクラスのインスタンスをmarshallします。したがって、そこから 'List'を得る機会はありません。 – Izruo

4

あなたはあなたのケースでは、文字列をファイルに変更することができ、ArrayListにHashMapを変換するためのコードの下に使用してください。

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

あなたがそのような配列リストにハッシュマップに変換..

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

HashMapArrayListは、2つの完全に異なるデータ型です。

HashMapは、鍵格納Mapインタフェースの実装です:valueのペア

ArrayListはアイテム

のリストを格納Listインタフェースの実装であるSOに変換する方法についてのスレッドのトンがあります。リストへのマップ(例:here)。

1

それは

そこにはあなたのコードに変換されていない、そしてそれがまさに問題であるがArrayListにHashMapを変換の誤差を示しています。 HashMapをArrayListとしてキャストしようとしていますが、そうではありません。 Possible readingPossible reading 2

1は、によって行われることになるの変換:DataSnapshot.getValue()のいずれかを返すことができ、Firebase APIで述べたように

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

の配列を持っているアイテム保存されています。

には、GoogleのJava Bean規約があります。

関連する問題