ExpandableListView с JSON в Android - ошибка листинга
Попытка сделать ExpandableListView с анализом JSON Получение ошибки,
Я просто попытался проанализировать данные из JSON в одну дочернюю группу, но не получилось. Любой решит это, и это будет полезно для меня. Помощь будет оценена.
Проект не содержит ошибок, но принудительно закрывается эмулятором после развертывания.
Мой код
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Activity;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.ExpandableListView;
import android.widget.ExpandableListView.OnChildClickListener;
import android.widget.ExpandableListView.OnGroupClickListener;
import android.widget.ExpandableListView.OnGroupCollapseListener;
import android.widget.ExpandableListView.OnGroupExpandListener;
import android.widget.Toast;
public class MainActivity extends Activity {
ExpandableListAdapter listAdapter;
ProgressDialog mProgressDialog;
ExpandableListView expListView;
List<String> listDataHeader;
ArrayList<HashMap<String, String>> arraylist;
HashMap<String, List<String>> listDataChild;
private static final String TAG_CONTACTS = "contacts";
private static final String TAG_ID = "id";
private static final String TAG_NAME = "name";
private static final String TAG_EMAIL = "email";
private static final String TAG_ADDRESS = "address";
private static final String TAG_GENDER = "gender";
private static final String TAG_PHONE = "phone";
private static final String TAG_PHONE_MOBILE = "mobile";
private static final String TAG_PHONE_HOME = "home";
private static final String TAG_PHONE_OFFICE = "office";
JSONArray contacts = null;
JSONObject jsonobject;
JSONArray jsonarray;
String [] str=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new DownloadJSON().execute();
// get the listview
expListView = (ExpandableListView) findViewById(R.id.lvExp);
// preparing list data
prepareListData();
listAdapter = new ExpandableListAdapter(this, listDataHeader, listDataChild);
// setting list adapter
expListView.setAdapter(listAdapter);
// Listview Group click listener
expListView.setOnGroupClickListener(new OnGroupClickListener() {
@Override
public boolean onGroupClick(ExpandableListView parent, View v,
int groupPosition, long id) {
// Toast.makeText(getApplicationContext(),
// "Group Clicked " + listDataHeader.get(groupPosition),
// Toast.LENGTH_SHORT).show();
return false;
}
});
// Listview Group expanded listener
expListView.setOnGroupExpandListener(new OnGroupExpandListener() {
@Override
public void onGroupExpand(int groupPosition) {
Toast.makeText(getApplicationContext(),
listDataHeader.get(groupPosition) + " Expanded",
Toast.LENGTH_SHORT).show();
}
});
// Listview Group collasped listener
expListView.setOnGroupCollapseListener(new OnGroupCollapseListener() {
@Override
public void onGroupCollapse(int groupPosition) {
Toast.makeText(getApplicationContext(),
listDataHeader.get(groupPosition) + " Collapsed",
Toast.LENGTH_SHORT).show();
}
});
// Listview on child click listener
expListView.setOnChildClickListener(new OnChildClickListener() {
@Override
public boolean onChildClick(ExpandableListView parent, View v,
int groupPosition, int childPosition, long id) {
// TODO Auto-generated method stub
Toast.makeText(
getApplicationContext(),
listDataHeader.get(groupPosition)
+ " : "
+ listDataChild.get(
listDataHeader.get(groupPosition)).get(
childPosition), Toast.LENGTH_SHORT)
.show();
return false;
}
});
}
private class DownloadJSON extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
// Create a progressdialog
mProgressDialog = new ProgressDialog(MainActivity.this);
// Set progressdialog title
mProgressDialog.setTitle("Sharani Designs");
// Set progressdialog message
mProgressDialog.setMessage("Loading...");
mProgressDialog.setIndeterminate(false);
// Show progressdialog
mProgressDialog.show();
}
@Override
protected Void doInBackground(Void... params)
{
arraylist = new ArrayList<HashMap<String, String>>();
// Retrieve JSON Objects from the given URL address
ArrayList<HashMap<String, String>> contactList = new ArrayList<HashMap<String, String>>();
jsonobject = JSONfunctions
.getJSONfromURL("http://api.androidhive.info/contacts/");
try {
// Locate the array name in JSON
jsonarray = jsonobject.getJSONArray(TAG_CONTACTS);
for(int i = 0; i < contacts.length(); i++){
JSONObject c = contacts.getJSONObject(i);
String id = c.getString(TAG_ID);
String name = c.getString(TAG_NAME);
str[i]=c.getString(TAG_NAME);
String email = c.getString(TAG_EMAIL);
String address = c.getString(TAG_ADDRESS);
String gender = c.getString(TAG_GENDER);
JSONObject phone = c.getJSONObject(TAG_PHONE);
String mobile = phone.getString(TAG_PHONE_MOBILE);
String home = phone.getString(TAG_PHONE_HOME);
String office = phone.getString(TAG_PHONE_OFFICE);
HashMap<String, String> map = new HashMap<String, String>();
// adding each child node to HashMap key => value
map.put(TAG_ID, id);
map.put(TAG_NAME, name);
map.put(TAG_EMAIL, email);
map.put(TAG_PHONE_MOBILE, mobile);
// adding HashList to ArrayList
contactList.add(map);
}
}
catch (JSONException e) {
e.printStackTrace();
}
// TODO Auto-generated method stub
return null;
}
@Override
protected void onPostExecute(Void args) {
// Locate the listview in listview_main.xml
mProgressDialog.dismiss();
}
}
/*
* Preparing the list data
*/
private void prepareListData() {
listDataHeader = new ArrayList<String>();
listDataChild = new HashMap<String, List<String>>();
// Adding child data
listDataHeader.add("Top 250");
listDataHeader.add("Now Showing");
listDataHeader.add("Coming Soon..");
// Adding child data
List<String> top250 = new ArrayList<String>();
for(int x=0;x<str.length;x++)
{
top250.add(str[x]);
}
List<String> nowShowing = new ArrayList<String>();
nowShowing.add("The Conjuring");
nowShowing.add("Despicable Me 2");
nowShowing.add("Turbo");
nowShowing.add("Grown Ups 2");
nowShowing.add("Red 2");
nowShowing.add("The Wolverine");
List<String> comingSoon = new ArrayList<String>();
comingSoon.add("2 Guns");
comingSoon.add("The Smurfs 2");
comingSoon.add("The Spectacular Now");
comingSoon.add("The Canyons");
comingSoon.add("Europa Report");
listDataChild.put(listDataHeader.get(0), top250); // Header, Child data
listDataChild.put(listDataHeader.get(1), nowShowing);
listDataChild.put(listDataHeader.get(2), comingSoon);
}
}
Добавлено разрешение доступа в Интернет. Имея класс JSONfunctions в моем пакете проекта, файл JSON также является допустимым.
Я думаю, что в этой части происходит только логическая ошибка, но я не знаю, как ее решить,
for(int x=0;x<str.length;x++)
{
top250.add(str[x]);
}
обновлен Logcat после инициализированной переменной str
02-07 06:47:06.231: E/AndroidRuntime(2490): FATAL EXCEPTION: main
02-07 06:47:06.231: E/AndroidRuntime(2490): Process: info.androidhive.expandablelistview, PID: 2490
02-07 06:47:06.231: E/AndroidRuntime(2490): java.lang.RuntimeException: Unable to start activity ComponentInfo{info.androidhive.expandablelistview/info.androidhive.expandablelistview.MainActivity}: java.lang.NullPointerException
02-07 06:47:06.231: E/AndroidRuntime(2490): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2176)
02-07 06:47:06.231: E/AndroidRuntime(2490): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2226)
02-07 06:47:06.231: E/AndroidRuntime(2490): at android.app.ActivityThread.access$700(ActivityThread.java:135)
02-07 06:47:06.231: E/AndroidRuntime(2490): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1397)
02-07 06:47:06.231: E/AndroidRuntime(2490): at android.os.Handler.dispatchMessage(Handler.java:102)
02-07 06:47:06.231: E/AndroidRuntime(2490): at android.os.Looper.loop(Looper.java:137)
02-07 06:47:06.231: E/AndroidRuntime(2490): at android.app.ActivityThread.main(ActivityThread.java:4998)
02-07 06:47:06.231: E/AndroidRuntime(2490): at java.lang.reflect.Method.invokeNative(Native Method)
02-07 06:47:06.231: E/AndroidRuntime(2490): at java.lang.reflect.Method.invoke(Method.java:515)
02-07 06:47:06.231: E/AndroidRuntime(2490): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777)
02-07 06:47:06.231: E/AndroidRuntime(2490): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593)
02-07 06:47:06.231: E/AndroidRuntime(2490): at dalvik.system.NativeStart.main(Native Method)
02-07 06:47:06.231: E/AndroidRuntime(2490): Caused by: java.lang.NullPointerException
02-07 06:47:06.231: E/AndroidRuntime(2490): at info.androidhive.expandablelistview.MainActivity.prepareListData(MainActivity.java:208)
02-07 06:47:06.231: E/AndroidRuntime(2490): at info.androidhive.expandablelistview.MainActivity.onCreate(MainActivity.java:60)
02-07 06:47:06.231: E/AndroidRuntime(2490): at android.app.Activity.performCreate(Activity.java:5243)
02-07 06:47:06.231: E/AndroidRuntime(2490): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
02-07 06:47:06.231: E/AndroidRuntime(2490): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2140)
02-07 06:47:06.231: E/AndroidRuntime(2490): ... 11 more
02-07 06:47:06.511: D/dalvikvm(2490): GC_FOR_ALLOC freed 201K, 9% free 2984K/3260K, paused 28ms, total 28ms
02-07 06:47:08.771: I/Process(2490): Sending signal. PID: 2490 SIG: 9
2 ответа
В приведенном выше коде у вас есть следующее:
for(int i = 0; i < contacts.length(); i++){
JSONObject c = contacts.getJSONObject(i);
String id = c.getString(TAG_ID);
String name = c.getString(TAG_NAME);
str[i]=c.getString(TAG_NAME);
String email = c.getString(TAG_EMAIL);
String address = c.getString(TAG_ADDRESS);
String gender = c.getString(TAG_GENDER);
Я не заметил, где именно вы инициализировали массив str с таким пробелом, как это:
str[] = new String[100]; // for example
если возможно, попытайтесь инициализировать это какое-то значение и затем сохранить значение в массиве.
И размер массива не может быть увеличен или уменьшен позже, было бы хорошо, если вы используете arraylist
вместо.
Кроме того, даже в prepareList()
метод, вы получаете доступ к длине строки, когда она не инициализируется каким-либо значением, как указано выше в некоторых строках.
Ваша проблема, вероятно, заключается в том, что вы ExpandableListView
до того, как ваши данные JSON станут доступны. Попробуйте позвонить вашему prepareListData
функция в вашем onPostExecute
функция.
Вероятно, это займет некоторое время, и вы получите ExpandableListView
пусто, если после этого вы не получите заполненный список расширения, попробуйте позвонить expListView.invalidateViews
Другая проблема, которую я вижу, заключается в том, что вы не инициализировали свой str
атрибут, это, вероятно, причина вашего NPE.