2016-03-24 3 views
0

Я довольно новичок в Android-разработчике, и мне нужна помощь.Чтение массива JSON в listview

Я строю повестку дня, которая загружает информацию из JSON, тогда ListView накачивается с помощью специального адаптера. Я сделал это и прекрасно работал.

Моя проблема заключается в следующем, когда я нажимаю контакт, другой объект загружается с дополнительной информацией о пользователе, используя тот же JSON. Я его отладить и recieves информации, как это:

Example Item: [{"id":1,"name":"Leanne Graham","hobby":"Play soccer","address":"Kulas Light, Gwenborough","phone":"1-770-736-8031 x56442"}] 

Потому что я послал информацию как JSONObject я бросил его, чтобы быть JSONArray, но когда я прохожу этот массив в мое RequestComplete моего приложения перерывов.

Ошибка:

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ListView.setAdapter(android.widget.ListAdapter)' on a null object reference 

/** Основная деятельность OnClick слушатель */

@Override 
public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
    System.out.println("POSITION: " + position); 
    JSONObject jsonObject = (JSONObject)JSONadapter.getItem(position); 


    Intent intent = new Intent(this, InfoActivity.class); 
    String pos_json = jsonObject.toString(); 
    intent.putExtra("pos_json",pos_json); 


    startActivity(intent); 

} 

/** Информация активность */

public class InfoActivity extends AppCompatActivity implements JSONRequest.JSONCallback { 

AdapterInfo JSONAdapter; 
private ListView listInfo; 
private JSONObject json_object; 
private JSONArray arrayMain; 

private ArrayList<String> jsonarray; 



@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_info); 

    JSONArray array = new JSONArray(); 

    try { 
     json_object = new JSONObject(getIntent().getStringExtra("pos_json")); 
     arrayMain = array.put(json_object); 


     System.out.println("Example Item: "+ arrayMain.toString()); 
     System.out.println(arrayMain.getClass().getName()); 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 
    requestComplete(arrayMain); 


    this.listInfo = (ListView) findViewById(R.id.listView2); 


} 



@Override 
public void requestComplete(JSONArray array) { 
    JSONAdapter = new AdapterInfo(InfoActivity.this,array); 
    this.listInfo.setAdapter(JSONAdapter); 


} 

/** Адаптер */

public class AdapterInfo extends BaseAdapter{ 

private JSONArray array; 
private Activity infoAct; 

public AdapterInfo(Activity infoAct, JSONArray array){ 
    this.array = array; 
    this.infoAct = infoAct; 
} 


@Override 
public int getCount() { 
    if(array == null){ 
     return 0; 
    }else{ 
     return array.length(); 
    } 
} 

@Override 
public JSONObject getItem(int position) { 
    if(array == null){ 
     return null; 
    }else{ 
     return array.optJSONObject(position); 
    } 

} 

@Override 
public long getItemId(int position) { 
    JSONObject object = getItem(position); 
    return object.optLong("id"); 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    if(convertView==null){ 
     convertView = infoAct.getLayoutInflater().inflate(R.layout.row,null); 

    } 

    TextView name = (TextView)convertView.findViewById(R.id.infoName); 
    TextView hobby = (TextView)convertView.findViewById(R.id.infoHobby); 
    TextView address = (TextView)convertView.findViewById(R.id.infoAddress); 
    TextView phone = (TextView)convertView.findViewById(R.id.infoPhone); 

    JSONObject json_data = getItem(position); 
    if(json_data != null){ 
     try { 
      String nombre = json_data.getString("name"); 
      String pasatiempo = json_data.getString("hobby"); 
      String direccion = json_data.getString("address"); 
      String telefono = json_data.getString("phone"); 

      name.setText(nombre); 
      hobby.setText(pasatiempo); 
      address.setText(direccion); 
      phone.setText(telefono); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 

    } 
    return convertView; 
}} 

/** JSONRequest */

public class JSONRequest extends AsyncTask<String, Void, JSONArray> { 

private JSONCallback callback; 

public JSONRequest(JSONCallback callback){ 
    this.callback = callback; 
} 


@Override 
protected JSONArray doInBackground(String... params) { 

    URLConnection connection = null; 
    BufferedReader br = null; 
    JSONArray result = null; 

    try{ 
     URL url = new URL(params[0]); 
     connection = (URLConnection) url.openConnection(); 


     InputStream is = connection.getInputStream(); 
     br = new BufferedReader(new InputStreamReader(is)); 
     StringBuilder builder = new StringBuilder(); 
     String line = ""; 

     while((line = br.readLine()) != null){ 

      builder.append(line); 
     } 

     result = new JSONArray(builder.toString()); 

    }catch (Exception e) { 

     e.printStackTrace(); 
    } finally { 


     try{ 


      if(br != null) br.close(); 

     }catch(Exception e) { 

      e.printStackTrace(); 
     } 
    } 

    return result; 
} 

@Override 
protected void onPostExecute(JSONArray jsonArray) { 
    super.onPostExecute(jsonArray); 
    callback.requestComplete(jsonArray); 
} 


public interface JSONCallback{ 

    void requestComplete(JSONArray array); 
}} 
+0

Ошибка не имеет ничего общего с JSONObject. Это связано с тем, что объект listInfo равен null, и вы пытаетесь вызвать на нем метод. Также избегайте вызовов System.out на Android; вместо этого используйте Log. – chRyNaN

ответ

1

Ваш код:

requestComplete(arrayMain); 

this.listInfo = (ListView) findViewById(R.id.listView2); 

requestComplete() использует this.listInfo экземпляр, но this.listInfo является недействительным, поскольку он устанавливается после requestComplete(). Поэтому вам нужно переключить свой заказ.

this.listInfo = (ListView) findViewById(R.id.listView2); 
requestComplete(arrayMain); 

Это лучше, если вы просто поставить его сразу после вызова setContentView() просто чтобы убедиться, что this.listInfo имеет действительный ListView экземпляр.

Смежные вопросы