使用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;
}
}
答案
代码中存在逻辑错误:
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; }
- 然后在你的
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?