2017-12-27 19 views
0

ListViewを最近使用する方法を学びましたので、あまり習熟しません。 JSONレスポンスのデータをListViewに追加する際に問題が発生しています。ハードコードされたStringをListViewに追加すると、正常に動作します。 JSONレスポンスからデータを入力するときは何も表示されません。 は、ここに私の活動である(SupportedAds.javaJSONレスポンスからのデータをAdapter(ListView)に入力する際に​​エラーが発生しました

public class SupportedAds extends AppCompatActivity { 

String[] Title; 
String[] Content; 
ListView list; 
Offers offer; 
ArrayList<Offers> offers = new ArrayList<>(); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_supported_ads); 
    list = findViewById(R.id.list); 


/* Getting Supported Ads from the api*/ 
    RequestQueue queue = Volley.newRequestQueue(SupportedAds.this); 
    final String URL_SUPPORTED_ADS = "http://lb-89089438.us-east-2.elb.amazonaws.com/api/offers"; 

    StringRequest postRequest = new StringRequest(Request.Method.POST, URL_SUPPORTED_ADS, 
      new Response.Listener<String>() 
      { 
       @Override 
       public void onResponse(String response) { 
        JSONArray jsonResponse; 
        String offerContent; 
        String offerTitle; 
        // response 
        Log.wtf("POST api/offers", response); 
        try { 
         jsonResponse = new JSONArray(response); 
         Title = new String[jsonResponse.length()]; 
         Content = new String[jsonResponse.length()]; 

         for(int i=0; i < jsonResponse.length(); i++) 
         { 
          JSONObject jsonobject = jsonResponse.getJSONObject(i); 
          offerContent = jsonobject.getString("offercontent"); 
          offerTitle = jsonobject.getString("offertitle"); 

          offer = new Offers(); 
          offer.setTitle(offerTitle); 
          offer.setContent(offerContent); 
          Log.e("Title", offerTitle); // shows correct values. No problem in JSON parsing or POST request 
          Log.e("Content", offerContent); // shows correct values. No problem in JSON parsing or POST request 
          offers.add(offer); 
         } 

        } catch (JSONException e) { 
         e.printStackTrace(); 
        } 
       } 
      }, 
      new Response.ErrorListener() 
      { 
       @Override 
       public void onErrorResponse(VolleyError error) { 
        // error 
        Log.d("POST api/offers", error.toString()); 
       } 
      } 
    ) { 
     @Override 
     protected Map<String, String> getParams() 
     { 
      return new HashMap<>(); 
     } 
    }; 
    queue.add(postRequest); 
/* Getting Supported Ads from the api*/ 

    /* If i use these hard coded values, it works fine */ 
    /*offer = new Offers(); 
    offer.setTitle("Ad1"); 
    offer.setContent("Advertisement #01 Description"); 
    offers.add(offer); 

    offer = new Offers(); 
    offer.setTitle("Ad2"); 
    offer.setContent("Advertisement #02 Description"); 
    offers.add(offer); 

    offer = new Offers(); 
    offer.setTitle("Ad3"); 
    offer.setContent("Advertisement #03 Description"); 
    offers.add(offer);*/ 

    list.setAdapter(new MyAdapter(getApplicationContext(), offers)); 

} 

private class MyAdapter extends BaseAdapter { 

    private Context context; 
    private ArrayList<Offers> offers; 

    public MyAdapter(Context context, ArrayList<Offers> offers) { 
     this.context = context; 
     this.offers = offers; 
    } 

    @Override 
    public int getCount() { 
     return offers.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return offers.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     return 0; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     TwoLineListItem twoLineListItem; 

     if (convertView == null) { 
      LayoutInflater inflater = (LayoutInflater) context 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      twoLineListItem = (TwoLineListItem) inflater.inflate(
        android.R.layout.simple_list_item_2, null); 
     } else { 
      twoLineListItem = (TwoLineListItem) convertView; 
     } 

     TextView text1 = twoLineListItem.getText1(); 
     TextView text2 = twoLineListItem.getText2(); 

     text1.setText(offers.get(position).getTitle()); 
     text2.setText(offers.get(position).getContent()); 

     return twoLineListItem; 
    } 
} 
} 

私はJSONレスポンスからのデータを(データは表示されませんされている - 背景色のため申し訳ありません)を使用してみてください nothing being displayed

私はハードコーディングされた文字列を使用します(背景色のため申し訳ありません) works fine in this case

レイアウトファイル(activity_supported_ads.xml

- この場合には正常に動作します

POSTリクエストからのレスポンス私は、

[ 
{ 
"offercontent": "Sample Description", 
"offertitle": "Ad 1", 

}, 
{ 
"offercontent": "42 inch TV", 
"offertitle": "TV ", 

}, 
{ 
"offercontent": "Coke Ad Offer description here", 
"offertitle": "Coke", 

}, 
{ 
"offercontent": "Cola Ad Offer description here", 
"offertitle": "Cola Offer", 

}, 
{ 
"offercontent": "Nestle Ad Offer description here", 
"offertitle": "Nestle Cerelac Offer", 
}, 
{ 
"offercontent": "New Year sale", 
"offertitle": "Chocolate", 

} 
] 

が私を助けてください(私は私がLog.eが抽出された値を表示するために使用するように私は、JSON応答の解析中に問題がないことを確信していると、彼らは正しいです)多くの時間を費やしても解決できません。

+0

https://stackoverflow.com/questions/9280965/arrayadapter-requires-the-resource-id-to-be-a-textview-xml-problems – Thientvse

+0

私は質問を更新し、出力スクリーンショットを追加しました –

+0

次のようにします。list.setAdapter(new MyAdapter(getApplicationContext()、offers)); inside onResponse() – Thientvse

答えて

0

お客様のコードlist.setAdapter(new MyAdapter(getApplicationContext(), offers));は、リクエストが完了する前に実行されるため、表示するデータはありません。この行は、構文解析がonResponseメソッド内で実行された後に実行する必要があります。

+0

私は今すぐ自分自身を理解し、トピックを閉じてそれを閉じるようになった。 はい。あなたは絶対に正しいです、ありがとう! –

関連する問題