2014-01-26 2 views
0

У меня есть AsyncTask, где в «doinbackground» обновляется переменная «pics», позже в postexecute я обновляю все, проблема в том, что я хочу обновить адаптер, когда я обновляю разномастные "фото". где я должен объявить адаптер и вызвать notifyDataSetChanged ??Android - адаптер обновления Gridview на фоне

 protected void onPostExecute(String file_url) { 
       // dismiss the dialog after getting all products 

      // updating UI from Background Thread 
      runOnUiThread(new Runnable() { 
       public void run() { 
        /** 
        * Updating parsed JSON data into ListView 
        * */ 
        mAdapter = new Gridadapter(tab.this, pics); 

         gridView.setAdapter(mAdapter); 
       } 
      }); 

thx!

ответ

0

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

адаптер может быть объявлен при объявлении других компонентов представлений, и вы должны использовать всегда один и тот же экземпляр. (Dont создать новый адаптер каждый раз, когда у вас есть обновление этого делать!)

Я хотел бы создать адаптер, как что:

public class GridAdapter extends BaseAdapter{ 

private ArrayList<Items> mItemList; 

    public void updateItemList(ArrayList<Items> newItemList){ 
     this.mItemList = newItemList; 
     notifyDataSetChanged(); 
    } 

} 

затем экземпляр это:

public void onCreate(Bundle savedInstance){ 
    // ...all the previous code 

    mGridView = (GridView) findViewById(R.id.gridview); 
    mGridAdapter = new GridAdapter(this); 
    mGridView.setAdapter(mGridAdapter); 

} 

и вызвать обновление от onPostExecute:

protected void onPostExecute(String file_url) { 
    mGridAdapter.updateItemList(pics); 

} 
+0

Done, наконец, я положил в doinbackground после каждого изменить в фотографии с \t \t runOnUiThread (новый Runnable() { \t \t \t \t общественности недействительным запуска() { \t \t \t \t \t/** \t \t \t \t \t * Обновление разобран данных JSON в ListView \t \t \t \t \t * */ \t \t \t \t \t mAdapter.notifyDataSetChange д(); \t \t \t \t} \t \t \t}); спасибо! – Sk8eR

+0

это работает .. но вы не пишете очень оптимизированный код. вы должны вызвать mAdapter.notifyDataSetChanged() как можно меньше, потому что он будет обновлять весь вид. если вы обновите адаптер и вызовите mAdapter.notifyDataSetChanged() только один раз, представление будет обновляться только один раз, и пользовательский интерфейс будет более восприимчивым. –

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