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

Android:在片段中使用listview时尚未创建内容视图?,android,android-listfragment,Android,Android Listfragment,我有两个标签的片段,每个标签都有各自的片段。每个选项卡都有自己的列表,该列表是从服务器加载的。但我的应用程序遇到了类似这样的异常 java.lang.RuntimeException:无法启动活动组件信息{com.oj.bs/com.oj.bs.ProjectFragaActivity}:java.lang.IllegalStateException:尚未创建内容视图 我不明白问题出在哪里。谁能告诉我我做错了什么 下面是我的片段类 public class ResidentialFragActi

我有两个标签的片段,每个标签都有各自的片段。每个选项卡都有自己的列表,该列表是从服务器加载的。但我的应用程序遇到了类似这样的异常

java.lang.RuntimeException:无法启动活动组件信息{com.oj.bs/com.oj.bs.ProjectFragaActivity}: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);
            }
        });
    }
}
公共类ResidentialFragActivity扩展SherlockListFragment实现ActionBar.TablListener{
列表视图列表视图;
ListView resListviewId;
...
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
getActivity().setContentView(R.layout.residential_列表);
}
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、已保存的包){
视图=充气机。充气(右布局。住宅清单,容器,假);
resListviewId=(ListView)view.findViewById(R.id.resProjListView);
projectList=newarraylist();
新建LoadProjects().execute();
ListView ListView=getListView();
setOnItemClickListener(新的android.widget.AdapterView.OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView arg0、View视图、int arg2、,
长arg3){
Intent href=newintent(getSherlockActivity(),ProjectDetailActivity.class);
字符串proj_id=((TextView)view.findViewById(R.id.projectId)).getText().toString();
href.putExtra(“项目id”,项目id);
getSherlockActivity().startActivity(href);
}
});
if(容器==null){
返回null;
}
返回视图;
}
public void onStart(){
super.onStart();
}
@凌驾
已选择的公共事务(选项卡,碎片事务ft){
ft.add(android.R.id.content,本“住宅”);
附(本);
}
@凌驾
已选择公共空页(选项卡,碎片事务ft){
ft.detach(这个);
}
@凌驾
已重新选择公共无效页签(页签,碎片事务){
}
//网络运营的内部类
私有类LoadProjects扩展异步任务{
@凌驾
受保护的字符串doInBackground(字符串…参数){
..........
//从最新的服务器获取数据
字符串jsonpProjList=ResdProj.makehttpreqtosrvrvr(projectUrl,“POST”,projRes);
返回null;
}
@凌驾
受保护的void onPostExecute(字符串结果){
getSherlockActivity().runOnUiThread(新的Runnable()命令){
@凌驾
公开募捐{
ListAdapter projAdapter=新的SimpleAdapter(getSherlockActivity(),
项目清单,R.布局图.住宅清单项目,
新字符串[]{PROJ_ID,PROJ_NAME},新int[]
{R.id.projectId,R.id.projectName});
//更新用户界面
setListAdapter(ProjaAdapter);
}
});
}
}

非常感谢

我想这就是问题所在,但不确定

 new LoadProjects().execute();
您在创建
listview
之前调用它,这就是为什么没有
view
所以在创建
listview
之后调用它

更新:-

或者在

`onResume()`.it will get called after `onCreate()` or `onCreateView()`

我认为这就是问题所在,但不确定

 new LoadProjects().execute();
您在创建
listview
之前调用它,这就是为什么没有
view
所以在创建
listview
之后调用它

更新:-

或者在

`onResume()`.it will get called after `onCreate()` or `onCreateView()`

首先,我可以在你的代码中看到很多“不好的东西”。我永远不会做的第一件事,我也不确定它是否会起作用是
getActivity().setContentView(R.layout.residential\u list)
。您可以使用xml向FragmentActivity添加
片段
,也可以直接添加到
FrameLayout
。只需查看Android中的
片段示例,了解如何实现这一点的最佳实践

其次,不需要在
onPostExecute()
中使用这个
runOnUiThread
,因为它已经在UI线程上运行了


我能想到的最后一件事是将第一组内容添加到您的
片段活动中,将您的选项卡添加到
操作栏中,并将您的片段附加到第一个/第二个选项卡上。然后,您可以使用
异步任务
正确地用数据填充
列表视图我们的代码。我永远不会做的第一件事是
getActivity().setContentView(R.layout.residential\u list),我也不确定它是否会起作用
。您可以使用xml向FragmentActivity添加
片段
,也可以直接添加到
FrameLayout
。只需查看Android中的
片段示例,了解如何实现这一点的最佳实践

其次,不需要在
onPostExecute()
中使用这个
runOnUiThread
,因为它已经在UI线程上运行了


我能想到的最后一件事是将第一组内容添加到您的
片段活动中,将您的选项卡添加到
操作栏中,并将您的片段附加到第一个/第二个选项卡上。然后,您可以使用
异步任务

用数据正确填充
列表视图您可以在其中为片段创建视图,并且它与包含它的活动分离,因此尽管片段的视图已准备就绪,但它不在屏幕上,并且您的“内容视图尚未创建”

您需要在片段上实现
onActivityCreated
,并调用

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

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

这将确保您的片段和活动都被创建