2013-11-09 7 views
-1

Я хочу создать ListView, который каждые 4 секунды добавляет элемент и фокусируется на последнем элементе. Проблема заключается в том, что мой фрагмент ждать AsyncTask закончен, и только потом показать (все время AsyncTask работать свой белый экран)Update ListView в AsyncTask

public class LogFragment extends SherlockFragment { 
    private ListView lvList; 
    private ArrayAdapter<String> adapter; 
    private UpdateTask mTask = null; 
    String[] values = new String[] { "Android", "iPhone", "WindowsMobile" }; 
@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.log_fragment, container, false); 
     lvList = (ListView) view.findViewById(R.id.lvLog); 
     final ArrayList<String> list = new ArrayList<String>(); 
     for (int i = 0; i < values.length; ++i) { 
      list.add(values[i]); 
     } 
     adapter = new ArrayAdapter<String>(getSherlockActivity(), 
       android.R.layout.simple_list_item_1, list); 
     lvList.setAdapter(adapter); 
     return view; 
    } 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     Log.d("myLogs", "LogFragment:OnCreate"); 
     mTask = new UpdateTask(); 
     super.onCreate(savedInstanceState); 
     mTask.execute(); 
    } 

И AnyncTask -

public class UpdateTask extends AsyncTask<Void, Void, Void> { 
     int temp = 10; 

     protected Void doInBackground(Void... params) { 
      getSherlockActivity().runOnUiThread(new Runnable() { 

       @Override 
       public void run() { 
        while (temp-- > 0) { 
         try { 
          TimeUnit.SECONDS.sleep(4); 
          adapter.add("Lol" + String.valueOf(temp)); 
          lvList.setSelection(lvList.getAdapter().getCount() - 1); 
          Log.d("myLogs", "Added from Async"); 
         } catch (InterruptedException e) { 
          // TODO Auto-generated catch block 
          e.printStackTrace(); 
         } 
        } 
       } 
      }); 

      return null; 

     } 

     protected void onPostExecute(String result) { 
      // Add code that loops through JSONArray and adds to adapter here 

     } 
    } 

Как решить мою проблему?

ответ

1

Позвоните по номеру notifyDataSetChanged(), чтобы обновить данные в вашем адаптере, это обновит то, что показано в вашем ListView. Кроме того, вызов runOnUiThread из doInBackground - плохая идея, этот метод был разработан для выполнения всех тяжелых операций за пределами потока пользовательского интерфейса, а onPostExecute предназначен для внесения изменений в пользовательский интерфейс после выполнения вашей задачи ... Я бы предложил следующие:

protected Void doInBackground(Void... params) { 
    TimeUnit.SECONDS.sleep(4); 
    adapter.add("Lol" + String.valueOf(temp)); 
    Log.d("myLogs", "Added from Async"); 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    return null; 

} 

protected void onPostExecute(String result) { 
    // Add code that loops through JSONArray and adds to adapter here 
    lvList.setSelection(lvList.getAdapter().getCount() - 1); 
    adapter.notifyDataSetChanged(); 
} 
+0

Без runOnUi это не работает (только исходная нить, которая создала список иерархии представлений, может коснуться ...). И я хочу видеть результат добавления по битам, не все строки сразу – Sunstrike

+0

Я отредактировал свой ответ, переместите вызов setSelection в onPostExecute. – 2Dee