2016-07-21 2 views
0

В настоящее время у меня есть приложение, которое извлекает данные из базы данных mysql и отображает их в необработанном формате JSON. В настоящее время я работаю над тем, чтобы эти данные были перенесены в переменную String и отображать ее в Listview для определенного действия. Проблема заключается в том, что при попытке отобразить эти данные мой список не заполняется; Я уверен, что переменная не пуста, поскольку оператор if мог бы ее захватить.Android - отображать данные из адаптера в Listview

Вот фрагмент кода MainActivity:

//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; 
    } 
} 

Вот код для моего 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(); 
    } 
} 

}

Вот код для моего 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; 
} 

}

и вот что он отображает при нажатии на кнопку «Parse JSON».

listView empty after population

Любая помощь или посоветовать, почему его не отображая была бы оценена!

Заранее благодарен!

+0

В вашем методе 'добавить()' в адаптере. добавьте вызов метода для обновления адаптера 'this.notifyDatasetChanged()' –

+0

Это, казалось, сработало! но не 100%, он отображает только 1 из 4 записей данных в моей базе данных. При получении исходных данных JSON я могу видеть более одного входа внутри. Есть идеи? Спасибо за ваш вклад Adil –

+0

Всегда ли оно отображает первое значение? Или последнее? Вы подтвердили, что jsonObject.length() возвращает правильное значение? –

ответ

0

ваша проблема, как представляется, здесь:

while(count<jsonObject.length()){ 

вы не зацикливание с использованием количества элементов массива, но с использованием количество отображенной ключ: значение объекта, который является один («server_response»), вы должны изменить эту строку:

while(count<jsonArray.length()){ 

,

у вас есть только первый элемент, потому что jsonObject.length() вернет 1, так как он имеет только один элемент.

из DOC, JSONObject, метод длины():

Возвращает число отображений имя/значение в этом объекте.

и в вашем случае у вас есть только одно имя/значение отображенный ("server_response":[array items...])

+0

Спасибо, что это решило мою проблему! –

+0

Добро пожаловать, рад, что это помогло. –

0

Заезд в Test.java. Я думаю, что Вы устанавливаете адаптер к ListView перед добавлением в него данные

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

Это, похоже, не имеет никакого значения :( –

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