如何在Android中完成AsyncTask后更新片段?

时间:2014-01-28 04:51:38

标签: java android android-fragments

可能有一种非常简单的方法,只需要一行或两行代码,但我不知道如何解决这个问题。

我想拥有最初在屏幕中央显示加载gif的片段,然后它会启动一个从我的服务器下载信息的AsyncTask。 AsyncTask完成后,我需要将Fragment的内容视图设置为不同的xml文件,然后显示我从服务器获得的一些内容。

我在想应该有某种类型的函数,比如Fragment.invalidate()Fragment.refresh(),可以帮助更新片段,但我似乎无法找到任何这样的函数。

另外,如果我在onCreateView函数之外的其他函数中更新Fragment,是否需要创建变量来保存最初传递给的LayoutInflaterViewGroup对象它,还是我可以使用函数调用来访问它们?以下是我想做的事情......

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的静态函数。我知道这些都适用于我的情况。我需要在onPostExecute课程的GetDataTask部分中获得第1点和第3点的帮助。

谢谢!

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分:0)

三件事:

  1. 使用AsyncTaskLoader而不是AsyncTask来防止在屏幕旋转后重新加载数据。或者在片段上调用setRetainInstance(true)以防止片段在旋转时被破坏。 (只是要小心处理分离状态)
  2. 您可以通过调用getActivity().findViewById(android.R.id.content)来获取活动的根视图,然后根据需要对其进行操作。您也可以创建一个具有两种状态的布局,并显示/隐藏它们所需的部分。
  3. 您可以随时致电LayoutInflater.from(getActivity())
  4. 获取充气信号