ListFragment onCreate()显示不正确,onResume()后显示正常
ListFragment does not display correctly onCreate(), but is ok after onResume()
我的活动
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//list is global var
list = (MyListFragment) getFragmentManager().findFragmentById(com.myapp.R.id.mainActivity_myListFragment);
//add all objects to list
list.getListView().invalidateViews();
}
@Override
protected void onResume(){
super.onResume();
list.getListView().invalidateViews();
}
MyListFragment
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
MyAdapter adapter = new MyAdapter(new ArrayList());
setListAdapter(adapter);
}
public View getView(int position, View convertView, ViewGroup container) {
View view = super.getView(position, convertView, container);
TextView main = (TextView) view.findViewById(mylibs.common.R.list_main);
TextView sub = (TextView) view.findViewById(mylibs.common.R.list_sub);
ImageView image = (ImageView) view.findViewById(mylibs.common.R.list_image);
//set the View content here.
}
问题是,我无法正确显示第一个运行。但是,如果 onResume()
被 Android 调用,则一切都显示得很好。我该如何解决?
列表中的第一项始终正确显示,只有列表的其余部分有问题。
在onCreate()
之后调试getView()
的时候,明明在getView()
方法中设置了TextView和ImageView我想要的数据,但是不显示它没有显示我想要的数据,而是显示 Object
的 toString()
String
,它位于 TextView 之一的 Adapter
中,所有其他的都留空。
Android 很糟糕,这是在浪费时间。
我还在寻找答案,但解决方法是创建一个新线程,休眠 1ms,然后 runonUIThread()
invalidateViews()
.
您在这里做的一些事情很可能是问题的根源:
A) 片段在您的 Activity 的 onCreate() 函数期间不会膨胀,因此您无法在那里访问它们。这里的最佳实践是在片段自己的 onCreateView() 生命周期回调期间访问/操作片段视图。这是它们在屏幕上膨胀之前的点,所以是完美的点。您创建的 activity 和片段应该相对独立。碎片应该是可重复使用的。例如,如果您在 X 多个活动中需要此片段,您会怎么做?
B) 我觉得你的 getView()
很可疑。列表视图通常由 xml 中的 listview
视图组、适配器(由 onCreateView()
实例化)、列表视图将包含的对象模型集合以及单独的xml 具有定义列表中每个单元格的视图。 getView()
通常是您在适配器 中覆盖 的函数(使用视图持有者模式),您可以在其中访问和填充构成来自单独 [=34 的单元格的视图=].
也许你已经正确设置了它,但你给我们的东西读起来并不像它(适配器绝对不应该设置在片段的 onCreate()
中)。
Vogella has a nice tutorial 列表视图。祝你好运!
我的活动
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//list is global var
list = (MyListFragment) getFragmentManager().findFragmentById(com.myapp.R.id.mainActivity_myListFragment);
//add all objects to list
list.getListView().invalidateViews();
}
@Override
protected void onResume(){
super.onResume();
list.getListView().invalidateViews();
}
MyListFragment
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
MyAdapter adapter = new MyAdapter(new ArrayList());
setListAdapter(adapter);
}
public View getView(int position, View convertView, ViewGroup container) {
View view = super.getView(position, convertView, container);
TextView main = (TextView) view.findViewById(mylibs.common.R.list_main);
TextView sub = (TextView) view.findViewById(mylibs.common.R.list_sub);
ImageView image = (ImageView) view.findViewById(mylibs.common.R.list_image);
//set the View content here.
}
问题是,我无法正确显示第一个运行。但是,如果 onResume()
被 Android 调用,则一切都显示得很好。我该如何解决?
列表中的第一项始终正确显示,只有列表的其余部分有问题。
在onCreate()
之后调试getView()
的时候,明明在getView()
方法中设置了TextView和ImageView我想要的数据,但是不显示它没有显示我想要的数据,而是显示 Object
的 toString()
String
,它位于 TextView 之一的 Adapter
中,所有其他的都留空。
Android 很糟糕,这是在浪费时间。
我还在寻找答案,但解决方法是创建一个新线程,休眠 1ms,然后 runonUIThread()
invalidateViews()
.
您在这里做的一些事情很可能是问题的根源:
A) 片段在您的 Activity 的 onCreate() 函数期间不会膨胀,因此您无法在那里访问它们。这里的最佳实践是在片段自己的 onCreateView() 生命周期回调期间访问/操作片段视图。这是它们在屏幕上膨胀之前的点,所以是完美的点。您创建的 activity 和片段应该相对独立。碎片应该是可重复使用的。例如,如果您在 X 多个活动中需要此片段,您会怎么做?
B) 我觉得你的 getView()
很可疑。列表视图通常由 xml 中的 listview
视图组、适配器(由 onCreateView()
实例化)、列表视图将包含的对象模型集合以及单独的xml 具有定义列表中每个单元格的视图。 getView()
通常是您在适配器 中覆盖 的函数(使用视图持有者模式),您可以在其中访问和填充构成来自单独 [=34 的单元格的视图=].
也许你已经正确设置了它,但你给我们的东西读起来并不像它(适配器绝对不应该设置在片段的 onCreate()
中)。
Vogella has a nice tutorial 列表视图。祝你好运!