因为需要传入一个Fragment对象。而一般情况可能是判断为空则new 创建一个。如果这个fragment已经存在则不会new。
这时候就会出现一些比较莫名的问题。这个fragment会重走oncreateView等的生命周期。
比如一个Listview或GridView等,一般都是在oncreateView初始化。然后从网络请求数据。
判断adapter是否为空、为空就new 然后setadapter。不为空就调用adapter的notifyDataSetChanged。
这时候问题就来了。因为这个fragment对象一直都在。而且他的adapter也不为空。但是重走了生命周期之后重新执行findviewbyid等方法。拿到的是新的Listview,gridView对象。却不会走setadapter。导致界面空白。
比如
重走生命周期的时候发现。我们的mGridView是之前已经赋值的。
initView之后,绑定到的是新的对象。所以之前的gridview是设置了adapter的。但是新的我们正在显示的对象没能执行到setadapter方法。
解决办法也很简单。在初始化的时候就设置adapter,网络加载数据之后调用notifyDataSetChanged。
其实之前也遇到过类似的问题。比如测试假数据的时候发现。在fragment声明一个Arraylist。
ArrayList<String> mList=new ArrarList();
这样,然后在生命周期的方法中添加6条假数据,切换到其他fragment再通过replace方法切换回来的时候发现数据变为12条了、因为这个mList对象一直存在、每次进来走到声明周期的方法都会往里面add数据。会越add越大。解决办法也是声明与初始化分开,在生命周期的方法里面去初始化这个ArrayList即可。