我得到了返回的字符串从我StringRequest,但我不能将字符串复制到另一个变量,甚至定制我的列表视图
问题描述:
我有两个类: MainActivity类别,它包含以下代码定制我的列表视图,但我始终有一个错误,我不知道错在哪里。 我想要做的是从响应变量中获取一个字符串,然后将其转换为JSONObject并填写Arraylist以将其与我的customadapter一起使用,但问题是它coudnt复制到arraylist我不知道错在哪里。我得到了返回的字符串从我StringRequest,但我不能将字符串复制到另一个变量,甚至定制我的列表视图
public class MainActivity extends AppCompatActivity {
ArrayList<String> title_list = new ArrayList<String>();
ArrayList<String> c_count_data = new ArrayList<String>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final ListView lv = (ListView) findViewById(R.id.lv00);
setContentView(R.layout.activity_main);
StringRequest request = new StringRequest(Request.Method.POST, (new MY_URL().MY_URL)+"api/api_count.php", new Response.Listener<String>() {
@Override
public void onResponse(String response){
response = response.replaceAll("\\s+","");
JSONArray jArray;
JSONObject jObject;
try {
jArray = new JSONArray(response);
jObject = jArray.getJSONObject(0);
c_count_data.add(0, (String) jObject.get("NAM"));
c_count_data.add(1, (String) jObject.get("SAM"));
c_count_data.add(2, (String) jObject.get("EUO"));
c_count_data.add(3, (String) jObject.get("ASI"));
c_count_data.add(4, (String) jObject.get("AFR"));
c_count_data.add(5, (String) jObject.get("AUS"));
} catch (Exception e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(ListView00Activity.this, error.toString(), Toast.LENGTH_SHORT).show();
}
});
RequestQueue re = Volley.newRequestQueue(this);
re.add(request);
title_list.add(0, "North America");
title_list.add(1, "South America");
title_list.add(2, "Europe");
title_list.add(3, "Asia");
title_list.add(4, "Africa");
title_list.add(5, "Australia");
lv.setAdapter(new CustomAdapter(MainActivity.this,this,title_list,c_count_data));
}
}
我的适配器类是:
Context context;
Activity activity;
ArrayList<String> n_arr = new ArrayList<String>();
ArrayList<String> c_arr = new ArrayList<String>();
public CustomAdapter(Context context, Activity activity, ArrayList<String> n_arr, ArrayList<String> c_arr) {
this.context = context;
this.activity = activity;
this.n_arr = n_arr;
this.c_arr = c_arr;
}
@Override
public int getCount() {
return n_arr.size();
}
@Override
public Object getItem(int i) {
return n_arr.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
View v = inflater.inflate(R.layout.model, (ViewGroup) activity.findViewById(R.id.parent_viewgroup),false);
TextView count = (TextView) v.findViewById(R.id.tit);
TextView name = (TextView) v.findViewById(R.id.desc);
count.setText(c_arr.get(i));
name.setText(n_arr.get(i));
return v;
}}
的错误信息是:
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ListView.setAdapter(android.widget.ListAdapter)' on a null object reference
at com.mypro.theproject_v1.MainActivity.onCreate(MainActivity.java:89)
感谢您对您的ADVA的帮助赞赏NCE ...
答
单从外来看,我会说,lv
为空时lv.setAdapter(...)
被调用,即 final ListView lv = (ListView) findViewById(R.id.lv00);
没有找到你的看法。请先检查一下。
当lv.setAdapter(...)
被调用且NPE命中时,您的请求很可能仍在队列中,因此您的整个请求和适配器代码不会执行。
答
试试这个
变化
final ListView lv = (ListView) findViewById(R.id.lv00);
setContentView(R.layout.activity_main);
到
setContentView(R.layout.activity_main);
final ListView lv = (ListView) findViewById(R.id.lv00);
注意 findViewById
方法需要后setContentView
方法调用。
你可以检查我的答案。 @Ahmed – KeLiuyue