ListFragment无法正确显示onCreate(),但在onResume()之后可以正常显示

时间:2015-10-21 01:35:46

标签: android android-listfragment

MyActivity

@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.
}

问题是,我无法正确显示第一次运行。但是,如果Android调用onResume(),则所有内容都显示正常。我该如何解决这个问题?

列表中的第一项始终正确显示,只有列表的其余部分存在问题。

getView()之后立即调试onCreate()时,它清楚地显示TextView和ImageView是由getView()方法中我想要的数据设置的,但它不会显示而是显示显示我想要的数据时,它显示toString()String Object Adapter的{​​{1}},其中一个TextView,其他所有文本都留空。

2 个答案:

答案 0 :(得分:2)

你在这里做的一些事情很可能是问题的根源:

A)在您的Activity的onCreate()函数中,片段不会膨胀,因此您无法在那里访问它们。这里的最佳实践是在Fragment自己的onCreateView()生命周期回调期间访问/操作片段视图。这是他们在屏幕上充气之前的重点,所以这是一个完美的地方。您创建的活动和片段应相对独立。碎片应该可以重复使用。例如,如果你需要在X更多活动中使用这个片段,你会怎么做?

B)您的<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/background_floating_material_dark" tools:context="com.contag.app.fragment.NavDrawerFragment"> <ToggleButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:button="@drawable/toggle_selector" android:background="@android:color/transparent" android:gravity="center" android:textOn="@null" android:textOff="@null" android:minHeight="0dp" android:minWidth="0dp" android:id="@+id/toggleButton" android:layout_marginTop="26dp" android:layout_marginStart="156dp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="60" android:textColor="@android:color/holo_green_dark" android:textSize="15sp" android:id="@+id/textView" android:layout_alignLeft="@+id/toggleButton" android:layout_alignTop="@+id/toggleButton" android:layout_alignRight="@+id/toggleButton" android:layout_alignBottom="@+id/toggleButton" android:gravity="center" /> </RelativeLayout> 对我很怀疑。列表视图通常由xml中的getView()视图组,适配器(由listview实例化),列表视图将包含的对象的模型集合以及带有视图的单独xml定义。定义列表中的每个单元格。 onCreateView()通常是一个覆盖 适配器的功能(使用视图持有者模式),您可以在其中访问并填充组成单独xml单元格的视图。

也许你已经正确设置了它,但是你给我们的内容并没有像它那样读取(适配器肯定不应该在片段getView()中设置反正)。

列表视图上的

Looks like this。祝你好运!

答案 1 :(得分:-1)

Android是一个残骸,这是浪费时间。

我仍在寻找答案,但解决方法是创建一个新线程,休眠1毫秒,然后runonUIThread() invalidateViews()