2017-02-21 3 views
-1

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

Я создал модель (с 6 струнами) и адаптер. Проблема в том, что я не могу обновить List новым содержимым внутри функции doInBackground, и я не знаю, как поместить все в список.

+0

Эй, простой поиск Google поставил бы вас на правильный путь, но эй, не беспокойтесь. Там вы идете -> http://androidcss.com/android/fetch-json-data-android/ – saopayne

ответ

0

Если ваш Адаптер настроен правильно для прослушивания списка в качестве источника данных, вам просто нужно будет изменить элементы в Списке, а затем уведомить адаптер, вызвав один из методов уведомления, например adapter.notifyDataSetChanged().

Однако, поскольку это изменение элементов пользовательского интерфейса, это нужно будет запускать в потоке пользовательского интерфейса. Разработан метод AsyncTask doInBackground() запускается в отдельном потоке, чем в потоке пользовательского интерфейса, так что нам нужно сделать одну из двух вещей:

  • Подождите, пока мы не сделали в отдельном потоке, а затем уведомление адаптера
  • Скажите нить UI для уведомления адаптера

Первое легко сделать, если мы называем adapter.notifyDataSetChanged() в onPostExecuted методе в AsyncTask.

Второе легко сделать, если у нас есть ссылка на объект Activity, вызвав метод runOnUiThread(Runnable).

Надеюсь, это поможет.

0

doInBackground() У метода не было доступа к потоку пользовательского интерфейса, поэтому вы не можете этого сделать. В вашем случае вы должны обновить свой ListView методом onPostExecute или использовать этот метод runOnUiThread() непосредственно в вашем методе doInBackground().

0

Вы не можете обновить или поместить данные в listview в doInBackground() метод. Вы должны назначить Adpter к ListView, OnCreate() метод MainActivity и onPostExecute() Метод обновления ListView. Я разместил ниже фрагмент кода, который будет полезен.

public class MainActivity extends AppCompatActivity { 
String json_string; 
JSONObject jsonObject; 
JSONArray jsonArray; 
ContactAdapter contactAdapter; 
ListView listView; 

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

    new BackegroundTask().execute(); 
    listView = (ListView)findViewById(R.id.listview); 
    contactAdapter = new ContactAdapter(this,R.layout.row_layout); 

    listView.setAdapter(contactAdapter); 



} 

class BackegroundTask extends AsyncTask<Void,Void,String> 
{ 
    String json_url; 
    String JSON_STRING; 

    @Override 
    protected void onPreExecute() { 

     json_url = "http://10.0.2.2/webapp/index.php"; 
    } 

    @Override 
    protected String doInBackground(Void... voids) { 
     try { 
      URL url = new URL(json_url); 
      HttpURLConnection httpURLConnection = (HttpURLConnection)url.openConnection(); 
      httpURLConnection.setDoOutput(true); 
      InputStream inputStream = httpURLConnection.getInputStream(); 
      BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); 
      StringBuilder stringBuilder = new StringBuilder(); 

      while ((JSON_STRING = bufferedReader.readLine()) != null){ 
       stringBuilder.append(JSON_STRING+"\n"); 
      } 
      bufferedReader.close(); 
      inputStream.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) { 
     json_string = result; 

     try { 
      jsonObject = new JSONObject(json_string); 
      jsonArray = jsonObject.getJSONArray("server_response"); 
      int count = 0; 
      String id,username; 
      while (count<jsonArray.length()){ 
       JSONObject job = jsonArray.getJSONObject(count); 
       id = job.getString("id"); 
       username = job.getString("username"); 
       Contacts contacts = new Contacts(id,username); 
       contactAdapter.add(contacts); 
       contactAdapter.notifyDataSetChanged(); 
       count++; 
      } 

     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

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