LinearLayout removeAllViews后再 addView页面不展示

博主今天使用SmartRefreshLayout+ScrollView +ViewPager+Fragment的时候遇到了一个问题,下图是实现的效果:
LinearLayout removeAllViews后再 addView页面不展示_第1张图片
上图每个Tab对应的页面都是一个Fragment,此时页面定位到首页这个tab,首页Fragment的布局很简单:就是一个LinearLayout:

   <LinearLayout
        android:id="@+id/list_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" />

每次下拉刷新数据的时候,使用LinearLayout.addView来添加子view,比如上面的黄色,白色,蓝色,绿色几个子view都是通过LinearLayout的addView方法添加进来的,因为牵扯到下拉刷新,所以整体的代码框架就是如下:

LinearLayout listView = findViewById(list_layout);
//因为有下拉刷新,所以要删除之前的view
listView.removeAllViews();

//list是JavaBean
for(int i=0,size=list.size();i<size;i++){
  View itemView = mLayoutInflater.inflate(layoutId, null);
  listView.addView(itemView);
}

逻辑很简单:在添加itemView的时候,先调用LinearLayout.removeAllViews()删除所有的childView,然后在一个个addView添加新的itemView。

然而诡异的事儿出现了,操作流程如下:
1、点击tab,来回切换Fragment,反复几次。
2、在点击首页的tab切换回首页
3、下拉刷新页面
然后会发现黄色,白色,蓝色,绿色这几个子view都展示不出来了,debug发现上面代码的for循环是走了的,LinearLayout.getChildCount()也不是0.为什么会不展示呢?

经过一番测试,楼主发现LinearLayout.removeAllViews()的时候,LinearLayout的高度并没有回复添加之前的状态。也就是说假如添加之前LinearLayout的高度是100,添加itemView之后LinearLayout的高度变成了500。此时在下拉刷新,虽然LinearLayout.removeAllViews()但是LinearLayout的高度依然是500!!!
现象找到了,问题就好解决。把上面的代码修改如下,就是removeAllViews之后手动将LinearLayout的高度设置为WRAP_CONTENT,修改后的代码如下:

LinearLayout listView = findViewById(list_layout);
//因为有下拉刷新,所以要删除之前的view
listView.removeAllViews();

//手动重制高度
 LinearLayout.LayoutParams params =
                        new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
listView.setLayoutParams(params);

//list是JavaBean
for(int i=0,size=list.size();i<size;i++){
  View itemView = mLayoutInflater.inflate(layoutId, null);
  listView.addView(itemView);
}

至于具体原因,楼主还在研究,先此记录下来,希望能帮助到读者

你可能感兴趣的:(android,removeAllViews,addView,LinearLayout)