自定义listView适配器,型号,JSONParsing无效

时间:2017-02-21 07:12:51

标签: java php android json listview

我正在设计一个列表视图,显示来自php服务器的食物信息列表。 在我将其转换为json文件后,我传递的url是一个php文件。列表没有显示,我按下菜单中的刷新我不断 (app停止工作)..

这里是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       在android.widget.ArrayAdapter.getCount(ArrayAdapter.java:330)       在android.widget.ListView.setAdapter(ListView.java:462)       在alsaad.layla.mysqldemo.FoodView $ JSONTask.onPostExecute(FoodView.java:128)       在alsaad.layla.mysqldemo.FoodView $ JSONTask.onPostExecute(FoodView.java:54)       在android.os.AsyncTask.finish(AsyncTask.java:631)       在android.os.AsyncTask.access $ 600(AsyncTask.java:177)       在android.os.AsyncTask $ InternalHandler.handleMessage(AsyncTask.java:644)       在android.os.Handler.dispatchMessage(Handler.java:99)       在android.os.Looper.loop(Looper.java:137)       在android.app.ActivityThread.main(ActivityThread.java:5041)       at java.lang.reflect.Method.invokeNative(Native Method)       在java.lang.reflect.Method.invoke(Method.java:511)       在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:793)       在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)       在dalvik.system.NativeStart.main(本地方法)

3 个答案:

答案 0 :(得分:0)

ArrayAdater中的方法getCount()返回到适配器的对象列表的长度:

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

当您使用自定义ArrayAdapter时,我认为您必须覆盖此函数以使其返回您自己的对象列表的大小:

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

答案 1 :(得分:0)

好像你在for循环中遇到异常,这就是它进入异常并返回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<>();以摆脱崩溃。

答案 2 :(得分:0)

为什么使用ArrayAdapter而建议您使用BaseAdapter

当对象无法获取ArrayAdpter的实例并因此在getCount()返回空指针异常时,这是一个问题