Android AddView() 多个 导致 加载非常缓慢。

chaplinykaka 发布于 2016/06/15 15:38
阅读 2K+
收藏 0
如题,有很多地方 要根据 后台给的数据动态添加 View 。 每次加载都会卡住,很慢
加载中
0
花花兽
花花兽
listview 或者recycleview都很好,为什么要addview呢
chaplinykaka
chaplinykaka
应为 界面太复杂,每块都不一样。还需要根据数据加载不同的内容,内容里面还有许多和listview 类似的 列表 数据。所以比较麻烦
0
p
pekingese
每次addView会触发requestLayout,倘若在一段时间频繁的addView,必然会造成整个视图树requestLayout,假如界面比较复杂,动态添加的View比较多,就会引起整个视图树频繁requestLayout,从而引起每个View进行measure和layout,所以建议在循环添加View的时候不要调用addView,可以采用addViewInLayout,然后进行统一的requestLayout,希望能够帮助你
p
pekingese
回复 @chaplinykaka : 还有 你的方法命名为何是那样的
p
pekingese
回复 @chaplinykaka : 你看下下面我的回复,我试了下,没出现你出的问题啊
chaplinykaka
chaplinykaka
回复 @pekingese : 字数太多只能在底部回复了
p
pekingese
回复 @chaplinykaka : 恩 自己代码做下封装,希望能解决你的问题
chaplinykaka
chaplinykaka
回复 @pekingese : 嗯嗯,就是这个意思
下一页
0
chaplinykaka
chaplinykaka
回复 @pekingese : 前几天忙其他功能,但碰到一个问题,我封装了一个简单的
public class MyLLAddViewOnLayoutView extends LinearLayout{
private Context mContext;
public MyLLAddViewOnLayoutView(Context context) {
super(context);
this.mContext = context;

}


public MyLLAddViewOnLayoutView(Context context, AttributeSet attrs) {
super(context, attrs);
this.mContext = context;
}
@Override
protected boolean addViewInLayout(View child, int index, ViewGroup.LayoutParams params) {
return super.addViewInLayout(child, index, params);
}

public void mAddViewInlayout(View child,int index,ViewGroup.LayoutParams params){
addViewInLayout(child,index,params);
}
public void mAddViewInlayout(View child){
int index = this.getChildCount();
Logger.i("info","=======mAddViewInlayout=index="+index);
mAddViewInlayout(child, index);
}
public void mAddViewInlayout(View child,int index){
addViewInLayout(child,index,this.getLayoutParams());
}
}
动态 mAddViewInlayout(View child)  后 ,有的地方是好的,
有的地方 会显示不出来,确定这些地方都调用了 requestLayout();
0
p
pekingese

@chaplinykaka

我试了下是没问题的啊   

public void addViews(List<View> views) {

        for (View view : views) {
            addViewInLayout(view, -1, view.getLayoutParams(), true);
        }
        requestLayout();
        invalidate();

    }

简单的代码封装

p
pekingese
回复 @chaplinykaka : 这个就很难说了,要看下你触发的环境是啥才好跟踪,我测试了下是没问题的,有可能是你的代码方面有问题,或者其他什么原因
chaplinykaka
chaplinykaka
看到了你多 强制刷新 invalidate(),我没有用, 我有些地方是可以,有些地方是不可以的。很奇怪。
返回顶部
顶部