android - getActivity 在 Fragment 中返回 null

标签 android android-fragments android-activity

我有一个基本上是 ListView 的 fragment 。父 Activity 调用一个方法来从服务中检索名册项列表。当数据从服务返回时,我在经过的 fragment 和名册项的 ArrayList 上调用 updateRosterItems。问题是它在第一次通过时工作,但是当我选择不同的选项卡,然后返回到带有 fragment 的选项卡时,getActivity() 返回 null,我无法将数据连接到 ArrayAdapter。

这是 updateRosterItems 函数的代码:

public void updateRosterList(ArrayList<RosterInfo> rosterItems)
{
    if(_adapter == null)
    {
        _adapter = new RosterItemAdapter(getActivity(), R.layout.roster_listview_item, rosterItems);
    }

    Activity activity = getActivity();
    if(activity != null)
    {
        ListView list = (ListView)activity.findViewById(R.id.lstRosterItems);

        list.setAdapter(_adapter);
        _adapter.notifyDataSetChanged();
    }
}

我读过有关在附加 fragment 之前调用代码引起的类似问题。我想我的问题是,有没有办法将对 updateRosterList 的调用延迟到调用 onAttach 之后?我正在尝试的解决方案是,如果 getActivity() 返回 null,则将数据存储在 fragment 中的私有(private)变量中,并在 onAttach 方法中检查 varialbe 中是否有数据,然后在适配器上调用更新。不过这似乎有点老套。有什么想法吗?

最佳答案

更新:我已经设法让它工作了。我是 Android 开发的新手,作为解决方案对我来说似乎有点老套。有没有更好的办法? updateRosterList 函数基本上是从 fragment 外部调用的函数。

public class RosterListFragment extends Fragment {

RosterItemAdapter _adapter = null;
private ArrayList<RosterInfo> _items;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
    return inflater.inflate(R.layout.roster_listview, container, false);
}

@Override
public void onActivityCreated(Bundle savedInstanceState)
{
    super.onActivityCreated(savedInstanceState);

    if(_items != null)
    {
        performUpdateRosterList(_items);
    }

}

public void updateRosterList(ArrayList<RosterInfo> rosterItems)
{
    Activity activity = getActivity();
    if(activity != null)
    {
        performUpdateRosterList(rosterItems);
    }
    else
    {
        _items = rosterItems;
    }
}

private void performUpdateRosterList(ArrayList<RosterInfo> rosterItems)
{
    Activity activity = getActivity();
    if(_adapter == null)
    {
        _adapter = new RosterItemAdapter(activity, R.layout.roster_listview_item, rosterItems);
    }

    ListView list = (ListView)activity.findViewById(R.id.lstRosterItems);

    list.setAdapter(_adapter);
    _adapter.notifyDataSetChanged();
}

}

关于android - getActivity 在 Fragment 中返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13793537/

相关文章:

java - 非常大的数字选择器

android - 如果开始 “on create”无效,声音不会停止

android - 将移动设备的 SDCard 中的文件上传到文件服务器时出现进度条问题

android - 为什么我应该使用 PNG 而不是 JPG?

android - 我如何设计一个类似 "family tree"的用户界面?

java - ImageView 应该位于所有内容之上,例如 float 操作按钮

Android 构建始终创建调试 apk

java - 在java中从xml设置数字

java - 使用savedInstanceState保存 fragment 状态

java - TabHost 单击时启动外部浏览器