Пользовательский адаптер listView, модель, JSONParsing не работает

Я проектирую просмотр списка, который отображает список информации о еде с php сервера.
URL-адрес, который я передал, является файлом php после того, как я преобразовал его в файл json. список не отображается и когда я нажимаю обновить из меню я продолжаю получать
(приложение перестало работать) ..

Вот активность 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: ОСНОВНОЕ ИСКЛЮЧЕНИЕ: основное
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)
at 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)
в java.lang.reflect.Method.invokeNative (родной метод)
в 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 (собственный метод)

0

Решение

Кажется, вы получаете исключение в вашем for цикл, поэтому он входит в исключение и возвращает ноль, поэтому он показывает исключение нулевого указателя. Пожалуйста, замените 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

Другие решения

Метод getCount() в ArrayAdater возвращает длину списка объектов, привязанного к адаптеру:

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

Поскольку вы используете собственный ArrayAdapter, я думаю, что вы должны переопределить эту функцию, чтобы она возвращала размер вашего собственного списка объектов:

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

Почему вместо этого вы используете ArrayAdapter, я бы посоветовал вам использовать BaseAdapter

Это проблема, когда ваш объект не может получить экземпляр ArrayAdpter и, следовательно, возвращает исключение нулевого указателя в getCount ()

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector