在创建时使用片段内的视图

时间:2014-01-12 12:55:51

标签: android fragment

我在片段中有一个列表视图。我试图在列表视图被夸大和引用后填充它。

我的第一次尝试是在片段的onCreate方法中引用listview,但onCreateView方法尚未对其进行膨胀,因此无法进行引用,并且列表保持无效。

然后我试图像某些人建议的那样引用onCreateView方法中的列表。然而,这似乎在 onCreate方法之后被称为。因此,我无法在onCreate方法中进行任何初始化,onCreateView似乎是放置初始化代码的不好的地方(例如设置列表适配器)。在片段中膨胀和引用listview的正确方法是什么,然后立即开始在代码中使用listview?

public class FragmentList extends Fragment {

    ListView list;
    List<Item> itemList;
    ListAdapter adapter;        
    Context context;

    @Override
    public void onCreate(Bundle savedInstanceState)
    {        
            itemList = getItemList();
            context = getCtxt();   

        adapter = new ListAdapter(itemList, context);
        if (list != null && adapter != null)
            list.setAdapter(adapter); // never reached, as list is always null here
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {        
        // Inflate the layout for this fragment

        View v = inflater.inflate(R.layout.fragment_list, container, false);

        list = (ListView) v.findViewById(R.id.list);

        return v;
    }
}

2 个答案:

答案 0 :(得分:1)

如果您的片段只包含ListView,则应扩展ListFragment并在onActivityCreated()中填充它。

答案 1 :(得分:1)

你误解了lifecycle of Fragment。 我建议你看看文档。

请注意,之前调用onCreate而不是onCreateView

不保留Context引用,因为片段可以分离,Context也不总是有效。

尝试这样的事情。

公共类FragmentList扩展了Fragment {

ListView list;
List<Item> itemList;
ListAdapter adapter;        
Context context;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
    Bundle savedInstanceState) {        
    // Inflate the layout for this fragment
    View v = inflater.inflate(R.layout.fragment_list, container, false);
    list = (ListView) v.findViewById(R.id.list);
    return v;
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
     super.onActivityCreated(savedInstanceState);      
     itemList = getItemList();
     adapter = new ListAdapter(itemList, getActivity());
     list.setAdapter(adapter);
}

}