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