使用CustomAdapter的ListView的NullPointerException [重复]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用CustomAdapter的ListView的NullPointerException [重复]相关的知识,希望对你有一定的参考价值。

这个问题在这里已有答案:

定制适配器文件包括...

1.初始化ArrayList。

2.初始化ListView。

3.从URL中包装数据并存储在ArrayList中

4.使用自定义适配器设置ListView

5.请检查MainActivity下面的CustomAdapter代码。

public class Screen2 extends AppCompatActivity {     

ProgressDialog pDialog;
        ArrayList<Information> record_list;
        ListView list_view;
        CustomAdapter listAdapter;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.screen2);
            record_list=new ArrayList<Information>();
            list_view=(ListView) findViewById(R.id.list_view);
            new Test().execute();
        }

        public class Test extends AsyncTask<String, Void, ArrayList<Information>> {
            @Override
            protected void onPreExecute() {

                super.onPreExecute();

                // Showing progress dialog
                pDialog = new ProgressDialog(Screen2.this);
                pDialog.setMessage("Please wait...");
                pDialog.setCancelable(false);
                pDialog.show();
            }

            @Override
            protected ArrayList<Information> doInBackground(String... params) {

                String jsonStr = makeServiceCall();
                try {
                    JSONArray jsonArray=new JSONArray(jsonStr);
                    for(int i=0;i<jsonArray.length();i++){
                        JSONObject jsonObject=jsonArray.getJSONObject(i);
                        String id=jsonObject.getString("id");
                        String name=jsonObject.getString("label");
                        String email=jsonObject.getString("email");
                        Information information=new Information(id,name,email);
                        record_list.add(information);
                        return record_list;
                    }
                    System.out.println(jsonStr);
                } catch (JSONException e) {
                    e.printStackTrace();
                }

                return null;
            }

            @Override
            protected void onPostExecute(ArrayList<Information> s) {
                super.onPostExecute(s);
                // Dismiss the progress dialog
                //listAdapter=new CustomAdapter(Screen2.this,record_list);
                listAdapter=new CustomAdapter(Screen2.this,record_list);
                list_view.setAdapter(listAdapter);
                if (pDialog.isShowing())
                    pDialog.dismiss();

                /**
                 * Updating parsed JSON data into ListView
                 * */
            }

            public String makeServiceCall(){
                String response = null;
                try {
                    URL url = new URL("http://192.168.1.109:9000/tasks2");
                    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                    conn.setRequestMethod("GET");
                    // read the response
                    InputStream in = new BufferedInputStream(conn.getInputStream());
                    response = convertStreamToString(in);
                } catch (MalformedURLException e) {
                    System.out.println("MalformedURLException: " + e.getMessage());
                } catch (ProtocolException e) {
                    System.out.println("MalformedURLException: " + e.getMessage());
                } catch (IOException e) {
                    System.out.println("MalformedURLException: " + e.getMessage());
                } catch (Exception e) {
                    System.out.println("MalformedURLException: " + e.getMessage());
                }
                return response;
            }

            private String convertStreamToString(InputStream is) {
                BufferedReader reader = new BufferedReader(new InputStreamReader(is));
                StringBuilder sb = new StringBuilder();

                String line;
                try {
                    while ((line = reader.readLine()) != null) {
                        sb.append(line).append('
');
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    try {
                        is.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println(sb);
                return sb.toString();
            }
        }

}

CustomAdapter.java:(这是我的CustomAdapter文件)我在这个文件中也没有看到任何错误...

public class CustomAdapter extends ArrayAdapter<Information> {

        public CustomAdapter(Context c, ArrayList<Information> record) {
            super(c, R.layout.custom_row, record);
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {

            // Get the data item for this position

            Information information = getItem(position);

            //LayoutInflater inflater=LayoutInflater.from(getContext());

            // Check if an existing view is being reused, otherwise inflate the view

            convertView = LayoutInflater.from(getContext()).inflate(R.layout.custom_row, parent, false);

            // Lookup view for data population

            TextView record_id = (TextView) convertView.findViewById(R.id.record_id);

            TextView record_name = (TextView) convertView.findViewById(R.id.record_name);

            TextView record_email = (TextView) convertView.findViewById(R.id.record_email);

            // Populate the data into the template view using the data object

            record_id.setText(information.id);
            record_name.setText(information.name);
            record_email.setText(information.email);

            return convertView;
        }
}
答案

代码中存在逻辑错误:

  1. for循环里面有一个return语句,你必须迭代所以这样做一个好的设计定义Arraylist的另一个变量让我们说s和代码看起来像这样: @Override protected ArrayList<Information> doInBackground(String... params) { String jsonStr = makeServiceCall(); ArrayList<Information> s = new ArrayList<Information>(); try { JSONArray jsonArray=new JSONArray(jsonStr); for(int i=0;i<jsonArray.length();i++){ JSONObject jsonObject=jsonArray.getJSONObject(i); String id=jsonObject.getString("id"); String name=jsonObject.getString("label"); String email=jsonObject.getString("email"); Information information=new Information(id,name,email); s.add(information); } System.out.println(jsonStr); return s; } catch (JSONException e) { e.printStackTrace(); } return null; }
  2. 然后在你的onPostExecute使record_list成为s像这样: @Override protected void onPostExecute(ArrayList<Information> s) { super.onPostExecute(s); // Dismiss the progress dialog //listAdapter=new CustomAdapter(Screen2.this,record_list); record_list = s; listAdapter=new CustomAdapter(Screen2.this,record_list); list_view.setAdapter(listAdapter); if (pDialog.isShowing()) pDialog.dismiss(); /** * Updating parsed JSON data into ListView * */ }

以上是关于使用CustomAdapter的ListView的NullPointerException [重复]的主要内容,如果未能解决你的问题,请参考以下文章

带有CustomAdapter的Listview项目上的上下文菜单android不显示

ListView CustomAdapter 未显示第一个位置结果

调用 notifyDataSetChanged 时未更新带有 customAdapter 的 ListView?

xml ListView CustomAdapter + Intent Serializable

xml ListView CustomAdapter

Android中的方向更改时,列表视图会被清除(使用customAdapter,List )