setAdapter上的Json null指针

时间:2017-12-27 16:03:55

标签: android json

我是android的新手。我在执行GetData时遇到NullPointerException 这是正确的阶级。 我认为问题 - 是错误的网址或获取数据的类型。 JSON文件:http://legs-legs.ru/cat1json.php?json=cat1

使用变量编辑代码

private ListView lv;
private ArrayList<HashMap<String, String>> newslist;

@Override
protected void  onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
...
newslist = new ArrayList<>();
lv = (ListView) findViewById(R.id.list_cat1);

    new GetData().execute();
}

private class GetData extends AsyncTask<Void, Void, Void> {
   ...
    @Override
    protected Void doInBackground(Void... arg0) {
        HttpHandler sh = new HttpHandler();
        // Making a request to url and getting response
        String url = "http://legs-legs.ru/cat1json.php?json=cat1";
        String jsonStr = sh.makeServiceCall(url);

        Log.e(TAG, "Response from url: " + jsonStr);
        if (jsonStr != null) {
            try {
                JSONObject jsonObj = new JSONObject(jsonStr);

                JSONArray contacts = jsonObj.getJSONArray("cat1");

                for (int i = 0; i < contacts.length(); i++) {
                    JSONObject c = contacts.getJSONObject(i);
                    String id = c.getString("id");
                    String title_cat1 = c.getString("title_cat1");
                    String fulltext_cat1 = c.getString("fulltext_cat1");

                    // tmp hash map for single contact
                    HashMap<String, String> news_item = new HashMap<>();

                    // adding each child node to HashMap key => value
                    news_item.put("id", id);
                    news_item.put("title_cat1", title_cat1);
                    news_item.put("fulltext_cat1", fulltext_cat1);
                    //contact.put("mobile", mobile);

                    // adding contact to contact list
                    newslist.add(news_item);
                }
            } catch (final JSONException e) {...

            }

        } else {...

        return null;
    }
    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);
        ListAdapter adapter = new SimpleAdapter(MainParser.this, newslist,
                R.layout.item_cat1, new String[]{ "title_cat1","fulltext_cat1"},
                new int[]{R.id.title_cat1, R.id.fulltext_cat1});
        lv.setAdapter(adapter);
    }
}

Logcat :( stackoverflow不允许我格式化代码中的文本)

12-27 20:18:05.341 8013-8048/? I/FA: App measurement is starting up, version: 11910
12-27 20:18:05.341 8013-8048/? I/FA: To enable debug logging run: adb shell setprop log.tag.FA VERBOSE
12-27 20:18:05.341 8013-8048/? I/FA: To enable faster debug mode event logging run:                                         adb shell setprop debug.firebase.analytics.app mobi.usage.appbackup
12-27 20:18:06.341 8383-8383/? I/FA: App measurement is starting up, version: 9452
12-27 20:18:06.341 8383-8383/? I/FA: To enable debug logging run: adb shell setprop log.tag.FA VERBOSE
12-27 20:18:06.829 8562-8612/? I/FA: App measurement is starting up, version: 11910
12-27 20:18:06.829 8562-8612/? I/FA: To enable debug logging run: adb shell setprop log.tag.FA VERBOSE
12-27 20:18:06.829 8562-8612/? I/FA: To enable faster debug mode event logging run:
                                       adb shell setprop debug.firebase.analytics.app mobi.usage.appbackup
12-27 20:18:08.249 8958-8958/? I/FA: App measurement is starting up, version: 9452
12-27 20:18:08.249 8958-8958/? I/FA: To enable debug logging run: adb shell setprop log.tag.FA VERBOSE
12-27 20:18:08.985 9131-9173/? I/FA: App measurement is starting up, version: 11910
12-27 20:18:08.985 9131-9173/? I/FA: To enable debug logging run: adb shell setprop log.tag.FA VERBOSE
12-27 20:18:08.985 9131-9173/? I/FA: To enable faster debug mode event logging run:
                                       adb shell setprop debug.firebase.analytics.app mobi.usage.appbackup

编辑: 应用程序崩溃开始。

    E/MainParser: Response from url: [{"id":"6","title_cat1":"Футболист Кокорин пострелял из пистолета на свадьбе в Осетии‍","img_cat1":"http:\/\/legs-legs.ru\/media\/image\/69ac0d3fd5efda52bbd81de7f32c77488ddd9ae4.jpg","fulltext_cat1":"<p>Нападающий санкт-петербургского Зенита Александр Кокорин пострелял из пистолета во время посещения свадьбы в Осетии. Видео в <b>инстаграме<\/b> спортсмена.<\/p>\r\n<p>Стрельбу в воздух Кокорин назвал дебютом.<\/p>\r\n<p>Ранее сообщалось, что Кокорин выложил в инстагреме фотографию с пистолетом, но позже удалил ее.<\/p>","doptext_cat1":"Любой текст"},{"id":"5","title_cat1":"Футболист Кокорин пострелял из пистолета на свадьбе в Осетии‍","img_cat1":"http:\/\/legs-legs.ru\/media\/image\/69ac0d3fd5efda52bbd81de7f32c77488ddd9ae4.jpg","fulltext_cat1":"<p>Нападающий санкт-петербургского Зенита Александр Кокорин пострелял из пистолета во время посещения свадьбы в Осетии. Видео опубликовано в <b>инстаграме<\/b> спортсмена.<\/p>\r\n<p>Стрельбу в воздух Кокорин назвал дебютом.<\/p>\r\n<p>Ранее сообщалось, что Кокорин выложил в инстагреме фотографию с пистолетом, но позже удалил ее.<\/p>","doptext_cat1":"любой текст"},{"id":"4","title_cat1":"Футболист Кокорин пострелял из пистолета на свадьбе в Осетии‍","img_cat1":"http:\/\/legs-legs.ru\/media\/image\/69ac0d3fd5efda52bbd81de7f32c77488ddd9ae4.jpg","fulltext_cat1":"<p>Нападающий санкт-петербургского Зенита Александр Кокорин пострелял из пистолета во время посещения свадьбы в Осетии. Видео опубликовано в <b>инстаграме<\/b> спортсмена.<\/p>\n<p>Стрельбу в воздух Кокорин назвал дебютом.<\/p>\n<p>Ранее сообщалось, что Кокорин выложил в инстагреме фотографию с пистолетом, но позже удалил ее.<\/p>","doptext_cat1":"Любой текст"},{"id":"3","title_cat1":"Футболист Кокорин пострелял из пистолета на свадьбе в Осетии‍","img_cat1":"http:\/\/legs-legs.ru\/media\/image\/69ac0d3fd5efda52bbd81de7f32c77488ddd9ae4.jpg","fulltext_cat1":"<p>Нападающий санкт-петербургского Зенита Александр Кокорин пострелял из пистолета во время посещения свадьбы в Осетии. Видео опубликовано в <b>инстаграме<\/b> спортсмена.<\/p>\r\n<p>Стрельбу в воздух Кокорин назвал дебютом.<\/p>\r\n<p>Ранее сообщалось, что Кокорин выложил в инстагреме фотографию с пистолетом, но позже удалил ее.<\/p>","doptext_cat1":"Любой текст"},{"id":"2","title_cat1":"Футболист Кокорин пострелял из пистолета на свадьбе в Осетии‍","img_cat1":"http:\/\/legs-legs.ru\/media\/image\/69ac0d3fd5efda52bbd81de7f32c77488ddd9ae4.jpg","fulltext_cat1":"<p>Нападающий санкт-петербургского Зенита Александр Кокорин пострелял из пистолета во время посещения свадьбы в Осетии. Видео опубликовано в <b>инстаграме
D/AndroidRuntime: Shutting down VM
W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0xa4d75b20)
E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: com.alexsprod.jsonparserproject, PID: 9985
                  java.lang.NullPointerException
                      at com.alexsprod.jsonparserproject.MainParser$GetData.onPostExecute(MainParser.java:139)
                      at com.alexsprod.jsonparserproject.MainParser$GetData.onPostExecute(MainParser.java:68)
                      at android.os.AsyncTask.finish(AsyncTask.java:632)
                      at android.os.AsyncTask.access$600(AsyncTask.java:177)
                      at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
                      at android.os.Handler.dispatchMessage(Handler.java:102)
                      at android.os.Looper.loop(Looper.java:136)
                      at android.app.ActivityThread.main(ActivityThread.java:5001)
                      at java.lang.reflect.Method.invokeNative(Native Method)
                      at java.lang.reflect.Method.invoke(Method.java:515)
                      at 

 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:609)
                      at dalvik.system.NativeStart.main(Native Method)

2 个答案:

答案 0 :(得分:3)

在响应

中获取JSONArray时,使用下面的代码更改代码
JSONArray array = new JSONArray(jsonStr);

for (int i = 0; i < array.length(); i++) {
  JSONObject c= array.getJSONObject(i);
  String id = c.getString("id");
  String title_cat1 = c.getString("title_cat1");
  String fulltext_cat1 = c.getString("fulltext_cat1");

  // tmp hash map for single contact
  HashMap<String, String> news_item = new HashMap<>();

 // adding each child node to HashMap key => value
  news_item.put("id", id);
  news_item.put("title_cat1", title_cat1);
  news_item.put("fulltext_cat1", fulltext_cat1);
 //contact.put("mobile", mobile);

 // adding contact to contact list
 newslist.add(news_item);
}

UPDTED

像这样改变分类代码。

public class CatOneFragment extends Fragment {

public ListView lv;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fr_cat1, container, false);
    lv = (ListView) view.findViewById(R.id.list_cat1);
    new GetData().execute();
    return view;
}


class GetData extends AsyncTask<Void, Void, Void> {

    private ArrayList<HashMap<String, String>> newslist = new ArrayList<>();


    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        //Toast.makeText("Json Data is downloading", Toast.LENGTH_LONG).show();
    }

    @Override
    protected Void doInBackground(Void... arg0) {
        HttpHandler sh = new HttpHandler();
        // Making a request to url and getting response
        String url = "http://legs-legs.ru/cat1json.php?json=cat1";
        String jsonStr = sh.makeServiceCall(url);
        newslist = new ArrayList<>();
        Log.e(TAG, "Response from url: " + jsonStr);
        if (jsonStr != null) {
            try {

                JSONArray array = new JSONArray(jsonStr);
                for (int i = 0; i < array.length(); i++) {
                    JSONObject c = null;
                    c = array.getJSONObject(i);
                    String id = c.getString("id");
                    String title_cat1 = c.getString("title_cat1");
                    String fulltext_cat1 = c.getString("fulltext_cat1");
                    // tmp hash map for single contact
                    HashMap<String, String> news_item = new HashMap<>();
                    news_item.put("id", id);
                    news_item.put("title_cat1", title_cat1);
                    news_item.put("fulltext_cat1", fulltext_cat1);
                    newslist.add(news_item);
                }
            } catch (final JSONException e) {
                Log.e(TAG, "Json parsing error: " + e.getMessage());
                //CANNOT RESOLVE METHOD
                getActivity().runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        //CANNOT RESOLVE METHOD
                        Toast.makeText(getActivity(),
                                "Json parsing error: " + e.getMessage(),
                                Toast.LENGTH_LONG).show();
                    }
                });

            }

        } else {
            Log.e(TAG, "Couldn't get json from server.");
            //CANNOT RESOLVE METHOD
            getActivity().runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    //CANNOT RESOLVE METHOD
                    Toast.makeText(getActivity(),
                            "Couldn't get json from server. Check LogCat for possible errors!",
                            Toast.LENGTH_LONG).show();
                }
            });
        }

        return null;
    }

    protected void onPostExecute(Void result) {
        super.onPostExecute(result);
        SimpleAdapter adapter = new SimpleAdapter(getActivity(), newslist,
                R.layout.item_cat1, new String[]{"title_cat1", "fulltext_cat1"},
                new int[]{R.id.title_cat1, R.id.fulltext_cat1});
        //CANNOT RESOLVE SYMBOL
        lv.setAdapter(adapter);
    }
}

}

答案 1 :(得分:2)

试试这个

1.您的列表项目未定义Content_main_parser.xml

  <?xml version="1.0" encoding="utf-8"?>
  <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto"
      xmlns:tools="http://schemas.android.com/tools"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:id="@+id/flContent"
      app:layout_behavior="@string/appbar_scrolling_view_behavior"
      tools:context="com.alexsprod.jsonparserproject.MainParser"
      tools:showIn="@layout/app_bar_main_parser">

      <ListView
          android:id="@+id/list_cat1"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:text="@string/error_connecting"
          app:layout_constraintBottom_toBottomOf="parent"
          app:layout_constraintLeft_toLeftOf="parent"
          app:layout_constraintRight_toRightOf="parent"
          app:layout_constraintTop_toTopOf="parent" />

  </android.support.constraint.ConstraintLayout>
  1. Json解析错误

            JSONArray array = new JSONArray(jsonStr);
            for (int i = 0; i < array.length(); i++) {
            JSONObject c= null;
            c = array.getJSONObject(i);
            String id = c.getString("id");
            String title_cat1 = c.getString("title_cat1");
            String fulltext_cat1 = c.getString("fulltext_cat1");
            // tmp hash map for single contact
            HashMap<String, String> news_item = new HashMap<>();
            news_item.put("id", id);
            news_item.put("title_cat1", title_cat1);
            news_item.put("fulltext_cat1", fulltext_cat1);
            newslist.add(news_item);
    
  2. 使用volley尝试以下代码:

    3.在项目应用程序中添加依赖项 - > gradle

    compile 'com.android.volley:volley:1.1.0'
    

    4.主要活动

        public class MainParser extends AppCompatActivity {
            private ListView lv;
            private ArrayList<HashMap<String, String>> newslist;
    
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main_parser);
    
                newslist = new ArrayList<>();
                lv = (ListView) findViewById(R.id.list_cat1);
    
                StringRequest stringRequest = new StringRequest(Request.Method.GET, "http://legs-legs.ru/cat1json.php?json=cat1",
                        new Response.Listener<String>() {
                            @Override
                            public void onResponse(String jsonStr) {
    
                                try {
    
                                    JSONArray array = new JSONArray(jsonStr);
                                    for (int i = 0; i < array.length(); i++) {
                                        JSONObject c = null;
                                        c = array.getJSONObject(i);
                                        String id = c.getString("id");
                                        String title_cat1 = c.getString("title_cat1");
                                        String fulltext_cat1 = c.getString("fulltext_cat1");
                                        // tmp hash map for single contact
                                        HashMap<String, String> news_item = new HashMap<>();
                                        news_item.put("id", id);
                                        news_item.put("title_cat1", title_cat1);
                                        news_item.put("fulltext_cat1", fulltext_cat1);
                                        newslist.add(news_item);
                                    }
                                    SimpleAdapter adapter = new SimpleAdapter(MainParser.this, newslist,
                                            R.layout.item_cat1, new String[]{"title_cat1", "fulltext_cat1"},
                                            new int[]{R.id.title_cat1, R.id.fulltext_cat1});
                                    lv.setAdapter(adapter);
    
                                } catch (final JSONException e) {
    
                                }
    
    
                            }
    
                        }, new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        System.out.println("error" + error);
                    }
                });
                //Creating a Request Queue
                RequestQueue requestQueue = Volley.newRequestQueue(this);
                //Adding request to the queue
                requestQueue.add(stringRequest);
    
    
            }
    
    
        }