2017-07-17 10 views
0

私はvolleyライブラリを使用してJSONデータを取得しようとしています。すべてうまくいっていますが、データはCustomListAdapterに表示されません。私は問題がカスタムアダプターにあると思う。 JSONのURLは正常で、データは正常に取得されます。コードは以下の通りです。JSONボレーを介してデータを取得した後にカスタムリストアダプタが表示されない

CustomListAdapter.javaコード

public class CustomListAdapter extends ArrayAdapter<food> { 

private Activity act; 
private ArrayList<food>data; 
private int layoutResource; 
public CustomListAdapter(@NonNull Activity activity, int resource, ArrayList<food>items) { 
    super(activity, resource, items); 

    act=activity; 
    data=items; 
    layoutResource=resource; 

} 

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

@Nullable 
@Override 
public food getItem(int position) { 
    return super.getItem(position); 
} 

@Override 
public int getPosition(@Nullable food item) { 
    return super.getPosition(item); 
} 

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

@NonNull 
@Override 
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { 
    View row=convertView; 
    ViewHolder holder=null; 

    if(row==null || (row.getTag()==null)){ 
     LayoutInflater inflater=LayoutInflater.from(act); 
     row=inflater.inflate(layoutResource,parent,false); 

     holder=new ViewHolder(); 

     //get references to views 
     holder.ItemName=(TextView)row.findViewById(R.id.listName); 

     row.setTag(holder); 

    }else{ 
     holder=(ViewHolder)row.getTag(); 
    } 

    holder.foodItem=data.get(position); 

    //we can now display data 
    holder.ItemName.setText(holder.foodItem.getItemName()); 

    final ViewHolder finalHolder = holder; 
    row.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Intent i=new Intent(act, FoodDetails.class); 
      Bundle mbundle=new Bundle(); 
      mbundle.putSerializable("bundleOnj", finalHolder.foodItem); 
      i.putExtras(mbundle); 
      act.startActivity(i); 
     } 
    }); 
    return row; 
} 

public class ViewHolder{ 
    TextView ItemName; 
    food foodItem; 
} 
} 

ListActivity.javaコード。このコードでは、JSONオブジェクトを取得するためのsetTextを実行すると、正しく実行されています。

public class ListActivity extends AppCompatActivity { 

private CustomListAdapter adapter; 
private ListView listview; 
private ArrayList<food>foodItems=new ArrayList<>(); 
private String LEFT_URL="https://api.nutritionix.com/v1_1/search/"; 
private String RIGHT_URL="?fields=item_name%2Citem_id%2Cbrand_name%2Cnf_calories%2Cnf_total_fat&appId=MY_IDd&appKey=MY_API"; 
private TextView selectedItem; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_list); 

    listview=(ListView)findViewById(R.id.listView); 
    selectedItem=(TextView)findViewById(R.id.selectedItem); 
    adapter=new CustomListAdapter(ListActivity.this,R.layout.row,foodItems); 
    listview.setAdapter(adapter); 

    getFoodDetails("Butter"); 
} 

private void getFoodDetails(String item){ 
    //clear data first 
    foodItems.clear(); 

    String FINAL_URL=LEFT_URL+item+RIGHT_URL; 

    JsonObjectRequest foodObjectRequest=new JsonObjectRequest(Request.Method.GET, 
      FINAL_URL, (JSONObject) null, new Response.Listener<JSONObject>() { 
     @Override 
     public void onResponse(JSONObject response) { 

      try{ 
       JSONArray foodArray= response.getJSONArray("hits"); 

       for(int i=0;i<foodArray.length();i++){ 
        JSONObject JsonObject=foodArray.getJSONObject(i); 
        JSONObject fieldsObject=JsonObject.getJSONObject("fields"); 

        //get the Json Details 

        String itemName=fieldsObject.getString("item_name"); 
        //selectedItem.setText("item Selected: "+itemName); 
        String brand_name=fieldsObject.getString("brand_name"); 
        selectedItem.setText("item Selected: "+brand_name); 
        String servingSizeUnit=fieldsObject.getString("nf_serving_size_unit"); 
        double calories=fieldsObject.getDouble("nf_calories"); 
        //selectedItem.setText("item Selected: "+calories); 
        double fat=fieldsObject.getDouble("nf_total_fat"); 


        //putting data to set functions 
        food foodInfo=new food(); 
        foodInfo.setBrandName(brand_name); 
        foodInfo.setItemName(itemName); 
        foodInfo.setCalories(calories); 
        foodInfo.setFat(fat); 
        foodInfo.setServingSizeunit(servingSizeUnit); 

        foodItems.add(foodInfo); 
       } 

      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 

     } 
    }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 

     } 
    }); 
    AppController.getInstance().addToRequestQueue(foodObjectRequest); 
} 
} 
+1

てみてください 'notifyDataSetChanged追加した後、forループgetFoodDetailsにこのライン

listview.setAdapter(adapter); 

を削除()'あなた 'foodItems'リストに新しいオブジェクトを追加した後。 – beeb

+0

追加 ** foodItems.add(foodInfo);の後に** adapter.notifyDataSetChanged(); ** –

答えて

0

コールadapter.notifyDataSetChanged()リスト

+0

それは魅力的なように働いてくれてありがとう。 – Panther

0

にオブジェクトを追加した後、あなたは、データをフェッチする前に、アダプタを設定しています。 データの取得後にアダプタを設定します。

はのonCreateでこのライン

listview.setAdapter(adapter); 
+2

それは問題ではありません。空のリストを使用してアダプタを初期化することもできます。次に、進捗ダイアログを表示しながらデータを取得できます。 – beeb

関連する問題