Android:在片段中使用listview时尚未创建内容视图?

时间:2013-04-29 08:39:06

标签: android android-listfragment

我有两个标签片段,每个标签都有相应的片段。每个选项卡都有自己的列表,从服务器加载。但我的应用程序遇到了像

这样的异常
  

java.lang.RuntimeException:无法启动活动ComponentInfo {com.oj.bs/com.oj.bs.ProjectFragActivity}:java.lang.IllegalStateException:尚未创建的内容视图

我无法理解问题出在哪里。谁能告诉我我做错了什么?

以下是我的片段类

public class ResidentialFragActivity extends SherlockListFragment implements ActionBar.TabListener{

ListView listview;
ListView resListviewId;
...
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getActivity().setContentView(R.layout.residential_list);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle saved) {

    View view = inflater.inflate(R.layout.residential_list,container, false);
    resListviewId = (ListView)view.findViewById(R.id.resProjListView);
    projectList = new ArrayList<HashMap<String,String>>();
    new LoadProjects().execute();

    ListView listview = getListView();
    listview.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> arg0, View view, int arg2,
                long arg3) {
            Intent href = new Intent(getSherlockActivity(), ProjectDetailActivity.class);

                    String proj_id = ((TextView) view.findViewById(R.id.projectId)).getText().toString();  
                        href.putExtra("proj_id", proj_id);     
            getSherlockActivity().startActivity(href);
        }
    });
    if (container == null) {
        return null;
    }
    return view;
}

public void onStart() {
    super.onStart();
}
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
    ft.add(android.R.id.content,this,"residential");
    ft.attach(this);
}
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
    ft.detach(this);
}
@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
}

//inner class for network operation
private class LoadProjects extends AsyncTask<String, String, String> {

    @Override
    protected String doInBackground(String... params) {
        ..........
        //get data from the latest server
        String jsonpProjList = ResdProj.makeHttpReqToSrvr(projectUrl, "POST", projRes);

        return null;
    }
    @Override
    protected void onPostExecute(String result) {

        getSherlockActivity().runOnUiThread(new Runnable() {

            @Override
            public void run() {
                ListAdapter projAdapter = new SimpleAdapter(getSherlockActivity(),
                        projectList, R.layout.residential_list_item, 
                        new String[] {PROJ_ID,PROJ_NAME}, new int[] 
                            {R.id.projectId,R.id.projectName});
                //updating the UI
                setListAdapter(projAdapter);
            }
        });
    }
}

感谢Adavance

3 个答案:

答案 0 :(得分:1)

首先,我可以在代码中看到很多“坏事”。我永远不会做的第一件事我不确定它会起作用getActivity().setContentView(R.layout.residential_list);。您可以使用xml将Fragments添加到FragmentActivity或直接添加到FrameLayout。只需查看Android中Fragments的示例,了解如何实现此Fragments的最佳做法。

第二件事,无需在runOnUiThread中使用此onPostExecute(),因为它已在UI线程上运行。

我能想到的最后一件事就是首先将内容设置为FragmentActivity,将标签添加到ActionBar并在第一个/第二个标签上附加您的片段。之后,您可以使用ListView正确填充数据AsyncTask

答案 1 :(得分:0)

我认为这是问题,但不确定。

 new LoadProjects().execute();

您在listview创建之前调用此内容,这就是view创建后没有listview调用的原因。

<强>更新: -

或在

中调用new LoadProjects().execute();
`onResume()`.it will get called after `onCreate()` or `onCreateView()`

答案 2 :(得分:0)

所以你必须记住你生活在一个疯狂的世界,在那里你可以为你的片段创建视图,并且它与包含它的Activity分离,所以你的片段的视图已准备就绪,它不在屏幕上并且你的“内容”视图尚未创建“。

您将要在Fragment上实施onActivityCreated并致电

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

    new LoadProjects().execute();
}
从那里开始。

这将确保您的片段和活动都已创建。但等等还有更多。另外请记住,您可以使用activity.startActivity(...)离开您的活动,并且您的片段可能仍然存在(可能已经超脱)。在这种情况下,当您的活动恢复并重新连接您的片段时,onActivityCreated将再次被调用。所以这可能比你现在想要的更频繁地被调用。

我会告诉你什么时候真正触发它的业务逻辑,或者如果你离开活动就可以重新加载那些内容。祝你好运。