2014-01-28 4 views
3

Возможно, существует очень простой способ сделать это, что потребует только одну или две строки кода, но я не уверен, как это сделать.Как обновить фрагмент после завершения работы AsyncTask в Android?

Я хочу иметь фрагменты, изначально отображающие загрузочный экран в центре экрана, после чего он запустит AsyncTask, который загружает информацию с моего сервера. После завершения AsyncTask мне нужно будет настроить представление содержимого фрагмента в другом XML-файле, а затем отобразить некоторые из того, что я получил от сервера.

Я думал, что должна быть какая-то функция, например Fragment.invalidate() или Fragment.refresh(), которая может помочь обновить фрагмент, но я не могу найти такую ​​функцию.

Кроме того, если я обновить фрагмент в другой функции за пределами функции onCreateView, нужно ли мне создавать переменные для хранения LayoutInflater и ViewGroup объектов, которые первоначально переданных ей, или я могу получить доступ к этим с помощью вызовов функций? Ниже примерно то, что я хочу сделать ...

public class HomeFragment extends Fragment 
{ 
    public HomeFragment(){} 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    { 
     View view = inflater.inflate(R.layout.loading, container, false); 

     (new GetDataTask()).execute(1); 

     return view; 
    } 


    private class GetDataTask extends AsyncTask<Integer, Void, ServerResponse> 
    { 
     @Override 
     protected void onPreExecute(){} 

     @Override 
     protected ServerResponse doInBackground(Integer... args) 
     { 
      int page_num = args[0]; 
      return Server.getPosts(page_num); 
     } 

     @Override 
     protected void onPostExecute(ServerResponse result) 
     { 
      /* 
       1. Update the content view to R.layout.multi_post_list 
       2. Change specific text views and image views (I know how to do this part) 
       3. Notify that changes have been made to the Fragment, so it needs redrawn 
      */ 
     } 
    } 
} 

Примечание: ServerResponse это класс, который я создал, и Server.getPosts статическая функция, которая возвращает ServerResponse. Я знаю, что это работает в моем случае. Мне нужна помощь с очками 1 и 3 в моей onPostExecute части моего класса GetDataTask.

Спасибо!

ответ

0

Вы можете использовать findFragmentByTag

DetailsFragment df = getFragmentManager().findFragmentByTag("details"); 
    if (df != null) { 
     df.setShownIndex(getSelectedIndex()); 
    } else { 
     df = DetailsFragment.newInstance(getSelectedIndex()); 
    } 
    fragmentTransaction.replace(R.id.frame, df, "details").commit(); 
+0

Не знаете, где это 'getSelectedIndex()' приходят? Нет такого метода в Fragment.java – jas7457

+0

https://github.com/jayway/FragmentsLab/blob/master/src/com/jayway/lab/fragments/DetailsFragment.java –

0

Три вещи:

  1. Используйте AsyncTaskLoader вместо AsyncTask для предотвращения перегрузки данных после поворота экрана. Или позвоните setRetainInstance(true) на фрагменте, чтобы предотвратить разрушение фрагмента при вращении. (просто будьте осторожны, чтобы справиться с отдельным состоянием)
  2. Вы можете получить корневой вид Activity, вызвав getActivity().findViewById(android.R.id.content) и манипулировать им, но вам нужно. Вы также можете просто создать один макет, в котором есть оба состояния, и нужно показать/скрыть их части.
  3. Вы можете получить Inflater в любое время по телефону LayoutInflater.from(getActivity())
Смежные вопросы