2016-07-21 5 views
0

Ich habe zur Zeit eine Anwendung, die Daten aus einer MySQL-Datenbank holt und sie im rohen JSON-Format anzeigt. Ich arbeite derzeit daran, diese Daten in eine String-Variable zu pushen und sie in einer Listview für eine bestimmte Aktivität anzuzeigen. Problem ist, wenn ich versuche, diese Daten anzuzeigen, füllt meine Listview nicht; Ich bin sicher, dass die Variable nicht leer ist, da die if-Anweisung dies erfasst hätte. HierAndroid - Anzeige von Daten vom Adapter in Listview

ist Snippet MainActivity Code:

//Methods to grab information from abhandym_DB database 
public void getJSON(View view){ 
new BackgroundTask().execute(); 
} 

public void parseJSON(View view){ 
if(JSON_String==null){ 
    Toast.makeText(getApplicationContext(), "First Get Json", Toast.LENGTH_LONG).show(); 
}else{ 
    Intent intent = new Intent(this,Test.class); 
    intent.putExtra("JSON_Data",JSON_String); 
    startActivity(intent); 
} 
} 

class BackgroundTask extends AsyncTask<Void,Void,String>{ 

    String json_url; 

    @Override 
    protected void onPreExecute() { 
     json_url = "http://abhandyman.x10host.com/json_get_data.php"; 
    } 

    @Override 
    protected String doInBackground(Void... params) { 
     try { 
      URL url = new URL(json_url); 
      HttpURLConnection httpURLConnection = (HttpURLConnection)url.openConnection(); 
      InputStream inputSteam = httpURLConnection.getInputStream(); 
      BufferedReader buffereredReader = new BufferedReader(new InputStreamReader(inputSteam)); 
      StringBuilder stringBuilder = new StringBuilder(); 
      while((JSON_String = buffereredReader.readLine())!=null){ 
      stringBuilder.append(JSON_String+"\n"); 
      } 
      buffereredReader.close(); 
      inputSteam.close(); 
      httpURLConnection.disconnect(); 
      return stringBuilder.toString().trim(); 

     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    @Override 
    protected void onProgressUpdate(Void... values) { 
     super.onProgressUpdate(values); 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     TextView textView = (TextView)findViewById(R.id.fragment1_textview_JSONAPPEAR); 
     textView.setText(result); 
     JSON_String = result; 
    } 
} 

Hier ist der Code für meine Test.java

public class Test extends AppCompatActivity { 
String JSON_String; 
JSONObject jsonObject; 
JSONArray jsonArray; 
DataAdapter dataAdapter; 
ListView listView; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.test_layout); 
    listView = (ListView)findViewById(R.id.test_listView); 
    dataAdapter = new DataAdapter(this, R.layout.row_layout); 
    listView.setAdapter(dataAdapter); 
    JSON_String = getIntent().getExtras().getString("JSON_Data"); 
    try { 
     jsonObject = new JSONObject(JSON_String); 
     jsonArray = jsonObject.getJSONArray("server_response"); 
     int count = 0; 
     String jobid,problem,resolution; 
     while(count<jsonObject.length()){ 
      JSONObject JO = jsonArray.getJSONObject(count); 
      jobid = JO.getString("jobid"); 
      problem = JO.getString("problem"); 
      resolution = JO.getString("resolution"); 
      Data data = new Data(jobid,problem,resolution); 
      dataAdapter.add(data); 
      count++; 
     } 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 
} 

}

Hier ist der Code für meine Dataadapter:

public class DataAdapter extends ArrayAdapter{ 
List list = new ArrayList(); 
public DataAdapter(Context context, int resource) { 
    super(context, resource); 
} 

public void add(Data object) { 
    super.add(object); 
    list.add(object); 
} 

@Override 
public int getCount() { 
    return list.size(); 
} 

@Override 
public Object getItem(int position) { 
    return list.get(position); 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View row; 
    row = convertView; 
    DataHolder dataHolder; 
    if(row == null){ 
     LayoutInflater layoutInflater = (LayoutInflater)this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     row = layoutInflater.inflate(R.layout.row_layout,parent,false); 
     dataHolder = new DataHolder(); 
     dataHolder.tx_jobid = (TextView) row.findViewById(R.id.tx_jobid); 
     dataHolder.tx_problem = (TextView) row.findViewById(R.id.tx_problem); 
     dataHolder.tx_resolution = (TextView) row.findViewById(R.id.tx_resolution); 
     row.setTag(dataHolder); 
    }else{ 
    dataHolder = (DataHolder)row.getTag(); 
    } 
    Data data = (Data)this.getItem(position); 
    dataHolder.tx_jobid.setText(data.getJobid()); 
    dataHolder.tx_problem.setText(data.getProblem()); 
    dataHolder.tx_resolution.setText(data.getResolution()); 
    return row; 
} 

static class DataHolder{ 
TextView tx_jobid,tx_problem,tx_resolution; 
} 

}

und hier ist, was es anzeigt, wenn Sie auf "Parse JSON" klicken.

listView empty after population

Alle auf Hilfe oder raten, warum sein würde sehr geschätzt werden nicht angezeigt!

Vielen Dank im Voraus!

+0

In Ihrer Methode abgebildet haben '()' in Adapter hinzuzufügen. füge einen Methodenaufruf hinzu, um den Adapter zu aktualisieren 'this.notifyDatasetChanged()' –

+0

Das scheint zu funktionieren! aber nicht 100%, es zeigt nur einen der 4 Dateneinträge in meiner Datenbank an. Wenn ich die JSON-Rohdaten bekomme, kann ich deutlich mehr als 1 Eintrag darin sehen. Irgendwelche Ideen? Danke für deinen Beitrag Adil –

+0

Zeigt es immer den ersten Wert an? Oder die letzte? Haben Sie bestätigt, dass jsonObject.length() den richtigen Wert zurückgibt? –

Antwort

0

Ihr Problem Zugabe scheint hier zu sein:

while(count<jsonObject.length()){ 

Sie Looping nicht die Anzahl der Array-Elemente verwenden, aber unter Verwendung der Anzahl der abgebildeten Schlüssel: Wert-Objekt, das eine (die „server_response“) ist, müssen Sie diese Zeile ändern:

while(count<jsonArray.length()){ 

,

Sie haben nur das erste Element angezeigt, weil jsonObject.length()1 zurückgibt, da es nur ein Element hat.

vom doc, JSONObject, length() Methode:

Gibt die Anzahl der Name/Wert-Zuordnungen in dieses Objekt.

und in Ihrem Fall, dass Sie nur einen Namen/Wert ("server_response":[array items...])

+0

Danke Youzking, das hat mein Problem gelöst! –

+0

Gern geschehen, froh, dass es geholfen hat. –

0

Einchecken in Test.java. Ich denke, Sie werden die Adapter zur Listenansicht einstellen, bevor Daten darauf

protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.test_layout); 
     listView = (ListView)findViewById(R.id.test_listView); 
     dataAdapter = new DataAdapter(this, R.layout.row_layout); 

     JSON_String = getIntent().getExtras().getString("JSON_Data"); 
     try { 
      jsonObject = new JSONObject(JSON_String); 
      jsonArray = jsonObject.getJSONArray("server_response"); 
      int count = 0; 
      String jobid,problem,resolution; 
      while(count<jsonObject.length()){ 
       JSONObject JO = jsonArray.getJSONObject(count); 
       jobid = JO.getString("jobid"); 
       problem = JO.getString("problem"); 
       resolution = JO.getString("resolution"); 
       Data data = new Data(jobid,problem,resolution); 
       dataAdapter.add(data); 
       count++; 
      } 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
     listView.setAdapter(dataAdapter); //change effected 
    } 
+0

Das schien keinen Unterschied zu machen :( –