2016-07-12 12 views
-1

ここで誰かが、HashMapをJSON配列に変換してアダプタで使用する方法を知っているかどうか尋ねます。ロジックは、ログインしたときに、Volleyを使用してWebサーバー上のデータをフェッチし、SQLiteデータベースに格納し、同時に、リストアデータをカスタムリストビューに表示します。問題は、アプリケーション上の別の部分に移動して戻ってくると、時間がかかるボレーを再度要求することです。私が望むのは、SQLiteデータベースに保存されているデータが取得され、SwipeRefreshを使用してデータを更新したい場合は、新しいデータを更新する時間です。Hashmap to JSON Array

ここに私のコードです。

public void LoadMarkets() 
{ 
    Map<String,String>tmpRate = new HashMap<String,String>(); 

    RateDb db = new RateDb(getActivity().getApplicationContext()); 
    Cursor rs = db.getData(); 
    if(rs!=null && rs.getCount()>0) 
    { 
     if(rs.moveToFirst()) 
     { 
      while(rs.moveToNext()) 
      { 
       tmpRate.put("rateID",rs.getString(rs.getColumnIndex(RateDb.rateID))); 
       tmpRate.put("Name",rs.getString(rs.getColumnIndex(RateDb.rateName))); 
       tmpRate.put("Rate",rs.getString(rs.getColumnIndex(RateDb.rateRate))); 
       tmpRate.put("Date",rs.getString(rs.getColumnIndex(RateDb.rateDate))); 
       tmpRate.put("Time",rs.getString(rs.getColumnIndex(RateDb.rateTime))); 
       tmpRate.put("Ask",rs.getString(rs.getColumnIndex(RateDb.rateAsk))); 
       tmpRate.put("Bid",rs.getString(rs.getColumnIndex(RateDb.rateBid))); 
       tmpRate.put("Balance",rs.getString(rs.getColumnIndex(RateDb.rateBalance))); 
       //Log.d("MyDebug",rs.getString(rs.getColumnIndex(RateDb.rateName))); 
      } 
     } 
    } 
    rs.close(); 
    db.close(); 
    JSONObject jsonObject = new JSONObject(tmpRate); 
    JSONArray jsonArray = new JSONArray(); 
    jsonArray.put(jsonObject); 
    RowAAdapter rowAAdapter = new RowAAdapter(getActivity(),jsonArray); 
    lvMarkets.setAdapter(rowAAdapter); 
    swipeRefreshLayout.setRefreshing(false); 
} 

この機能をロードすると、最後のデータのみが表示されるという問題があります。

私の問題を助けてくれることを願っています。

ありがとうございました。

+0

なぜハッシュマップを使用しているのですか?ハッシュマップを入れているように、値をjsonObjectに直接入れることができます –

+0

?それはまったく同じだと思うし、アダプタがJSONArrayとして設定されているのでjsonarrayにしたかった – Raven

+0

答えを確認する –

答えて

0

あなたはこのようにハッシュマップに追加するのではなく、jsonObjectに値を直接置くことができます。

public void LoadMarkets() 
{ 


    RateDb db = new RateDb(getActivity().getApplicationContext()); 
    Cursor rs = db.getData(); 
    if(rs!=null && rs.getCount()>0) 
    { 
     if(rs.moveToFirst()) 
     { 
      while(rs.moveToNext()) 
      { 
       JSONObject jsonObject = new JSONObject(); 
       jsonObject.put("rateID",rs.getString(rs.getColumnIndex(RateDb.rateID))); 
       jsonObject.put("Name",rs.getString(rs.getColumnIndex(RateDb.rateName))); 
       jsonObject.put("Rate",rs.getString(rs.getColumnIndex(RateDb.rateRate))); 
       jsonObject.put("Date",rs.getString(rs.getColumnIndex(RateDb.rateDate))); 
       jsonObject.put("Time",rs.getString(rs.getColumnIndex(RateDb.rateTime))); 
       jsonObject.put("Ask",rs.getString(rs.getColumnIndex(RateDb.rateAsk))); 
       jsonObject.put("Bid",rs.getString(rs.getColumnIndex(RateDb.rateBid))); 
       jsonObject.put("Balance",rs.getString(rs.getColumnIndex(RateDb.rateBalance))); 
       jsonArray.put(jsonObject); 
       //Log.d("MyDebug",rs.getString(rs.getColumnIndex(RateDb.rateName))); 
      } 
     } 
    } 
    rs.close(); 
    db.close(); 
    RowAAdapter rowAAdapter = new RowAAdapter(getActivity(),jsonArray); 
    lvMarkets.setAdapter(rowAAdapter); 
    swipeRefreshLayout.setRefreshing(false); 
} 

あなたのコードに問題があることです:あなたはvalueskeysに入れている

"rateID", "Name" ...等whileループに何度も繰り返しますので、以前の値は新しい値に置き換えられ、最後にハッシュマップには1セットのデータしかありません。そのため、最後のデータセットしか得られないのです。

上記のコードをお試しください。期待どおりに動作するはずです。

これはループ内に新しいJsonObjectを作成し、データが正常に追加されたときにjsonArrayに追加するので、これは機能します。