2017-02-21 8 views
0

私はphpサーバからの食品情報リストを表示するリストビューを設計しています。 私が渡したURLはjsonファイルに変換した後のPHPファイルです。リストが示され、whent私は(アプリは動作を停止) を得続けるメニューからリフレッシュを押していません。..カスタムlistViewアダプタ、モデル、JSONParsingが機能しない

ここFoodView.java活動

ある
import android.content.Context; 
import android.os.AsyncTask; 
import android.support.annotation.NonNull; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.ImageView; 
import android.widget.ListView; 
import android.widget.TextView; 

import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 
import org.w3c.dom.Text; 

import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.OutputStream; 
import java.io.OutputStreamWriter; 
import java.net.HttpURLConnection; 
import java.net.MalformedURLException; 
import java.net.URL; 
import java.net.URLEncoder; 
import java.util.ArrayList; 
import java.util.List; 

import alsaad.layla.mysqldemo.Models.FoodModel; 

import static android.R.attr.resource; 
import static android.content.Context.LAYOUT_INFLATER_SERVICE; 

public class FoodView extends AppCompatActivity { 

private ListView lvFood; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_food_view); 


    lvFood = (ListView) findViewById(R.id.lvFood); 
} 

    public class JSONTask extends AsyncTask<String, String, List<FoodModel>> { 


     @Override 
     protected List<FoodModel> doInBackground(String... params) { 

      HttpURLConnection httpURLConnection = null; 
      BufferedReader reader = null; 


      try { 
       URL url = new URL(params[0]); 
       httpURLConnection = (HttpURLConnection) url.openConnection(); 
       httpURLConnection.connect(); 

       InputStream inputStream = httpURLConnection.getInputStream(); 
       reader = new BufferedReader(new InputStreamReader(inputStream)); 
       StringBuffer buffer = new StringBuffer(); 
       String line = ""; 
       while ((line = reader.readLine()) != null) { 
        buffer.append(line); 
       } 
       String finalJson = buffer.toString(); 


       JSONArray parentArray = new JSONArray(finalJson); 

       List<FoodModel> foodModelList = new ArrayList<>(); 


       for (int i = 0; i < parentArray.length(); i++) { 
        JSONObject finalObject = parentArray.getJSONObject(i); 
        FoodModel foodModel = new FoodModel(); 
        foodModel.setFood(finalObject.getString("name")); 
        //foodModel.setStatus(finalObject.getString("status")); 
        foodModel.setAmount(finalObject.getInt("amount")); 
        foodModel.setDescription(finalObject.getString("description")); 
        foodModel.setDate(finalObject.getInt("exDate")); 


        foodModelList.add(foodModel); 
       } 

       return foodModelList; 

      } catch (MalformedURLException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 


      } catch (JSONException e) { 
       e.printStackTrace(); 
      } finally { 
       if (httpURLConnection != null) { 
        httpURLConnection.disconnect(); 
       } 
      } 
      try { 
       if (reader != null) { 
        reader.close(); 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

      return null; 
     } 

     @Override 
     protected void onPostExecute(List<FoodModel> result) { 
      super.onPostExecute(result); 

      FoodAdapter adapter = new FoodAdapter(getApplicationContext(), R.layout.row, result); 
      lvFood.setAdapter(adapter); 


     }} 

     public class FoodAdapter extends ArrayAdapter { 

      private List<FoodModel> foodModelList; 
      private int resource; 
      private LayoutInflater inflater; 

      public FoodAdapter(Context context, int resource, List<FoodModel> objects) { 
       super(context, resource, objects); 
       foodModelList = objects; 
       this.resource = resource; 
       inflater = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE); 


      } 


      @Override 
      public View getView(int position, View convertView, ViewGroup parent) { 
       if (convertView == null) { 
        convertView = inflater.inflate(resource, null); 
       } 

       ImageView ivIcon; 
       TextView foodName, txt_amount, txt_desc, txt_date, txt_status; 

       ivIcon = (ImageView) convertView.findViewById(R.id.ivIcon); 
       foodName = (TextView) convertView.findViewById(R.id.foodName); 
       txt_amount = (TextView) convertView.findViewById(R.id.txt_amount); 
       txt_desc = (TextView) convertView.findViewById(R.id.txt_desc); 
       // txt_status = (TextView) convertView.findViewById(R.id.txt_status); 
       txt_date = (TextView) convertView.findViewById(R.id.txt_date); 

       foodName.setText(foodModelList.get(position).getFood()); 
       txt_amount.setText("Amount: " + foodModelList.get(position).getAmount()); 
       txt_desc.setText(foodModelList.get(position).getDescription()); 
       // txt_status.setText(foodModelList.get(position).getStatus()); 
       txt_date.setText("Date: " + foodModelList.get(position).getDate()); 


       return convertView; 
      } 
     } 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.navigation_drawer, menu); 
    return true; 
} 


@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    int id = item.getItemId(); 

    if (id == R.id.action_refresh) { 
     new JSONTask().execute("http://10.0.3.2/MySqlDemo/food.php"); 
     return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 
} 

FoodModel.java

public class FoodModel { 

private String food; 
//private enum status; 
private int amount; 
private String image; 
private String description; 
private int date; 




public int getDate() { 
    return date; 
} 

public void setDate(int date) { 
    this.date = date; 
} 

public String getFood() { 
    return food; 
} 

public void setFood(String food) { 
    this.food = food; 
} 

//public String getStatus() { 
// return status; 
// } 

// public void setStatus(String status) { 
// this.status = status; 
//} 

public String getImage() { 
    return image; 
} 

public void setImage(String image) { 
    this.image = image; 
} 

public String getDescription() { 
    return description; 
} 

public void setDescription(String description) { 
    this.description = description; 
} 

public int getAmount() { 
    return amount; 
} 

public void setAmount(int amount) { 
    this.amount = amount; 
} 
} 

logcatエラー:

02-20 05:06:08.084 4514-4514/alsaad.layla.mysqldemo E/AndroidRuntime: FATAL EXCEPTION: main java.lang.NullPointerException at android.widget.ArrayAdapter.getCount(ArrayAdapter.java:330) at android.widget.ListView.setAdapter(ListView.java:462) at alsaad.layla.mysqldemo.FoodView$JSONTask.onPostExecute(FoodView.java:128) at alsaad.layla.mysqldemo.FoodView$JSONTask.onPostExecute(FoodView.java:54) at android.os.AsyncTask.finish(AsyncTask.java:631) at android.os.AsyncTask.access$600(AsyncTask.java:177) at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:5041) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) at dalvik.system.NativeStart.main(Native Method)

+0

ショーあなたのアダプタコード –

答えて

0

forループで例外が発生しているため、例外になり、nullが返されるため、nullポインタ例外が表示されます。 getString()optSting()と置き換えてgetInt()optInt()に置き換えてください。

解決策: - forループにブレークポイントを入れ、以下のオプションを使用してください。

  for (int i = 0; i < parentArray.length(); i++) { 
       JSONObject finalObject = parentArray.getJSONObject(i); 
       FoodModel foodModel = new FoodModel(); 
       foodModel.setFood(finalObject.optString("name")); 
       //foodModel.setStatus(finalObject.optString("status")); 
       foodModel.setAmount(finalObject.optInt("amount")); 
       foodModel.setDescription(finalObject.optString("description")); 
       foodModel.setDate(finalObject.optInt("exDate")); 


       foodModelList.add(foodModel); 
      } 

return null;クラッシュから取得するreturn new ArrayList<>();と交換してください。

+0

sooooo多くありがとう、それは働いた – layla7

0

方法getCount() ArrayAdater内アダプタにatachedオブジェクトリストのな長さを返します。

/** 
    * {@inheritDoc} 
    */ 
    public int getCount() { 
     return mObjects.size(); 
    } 

あなたは私はあなたがそれはあなた自身のオブジェクトリストのサイズを返し作るために、この関数をオーバーライドしなければならないと思うカスタムArrayAdapter使用しているとおり:

 public int getCount() { 
      return foodModelList.size(); 
     } 
0

なぜあなたは代わりに私はあなたがオブジェクトとき、それが問題ですBaseAdapter

を使用するためにあなたを示唆しているArrayAdapter使用しているArrayAdpterのインスタンスを取得することができませんので、同様にgetCountでnullポインタ例外を返す()

関連する問題