listview嵌套listview的替换解决方案(适用于个别情况)

来源:互联网 发布:js条件公式编辑器 编辑:程序博客网 时间:2024/05/17 08:38

按照android的listview机制,理论上不推荐listview'嵌套。这不,我就遇到了listview嵌套listview 的诸多问题。

问题:listview 数据显示不完全(只显示一行)

listview的机制就是item的布局或者内容相似或者相同(具体原理这里不多讲,主要是我理解的也不是很深),每次加载到即将到来的item时候去onMeasure,这时候涉及到优化的问题,最好的优化就是利用ViewHolder缓存机制,将相同的布局缓存下来,这样在onMeasure的时候,由于布局高度一样,就不用去计算(或者计算时间几乎忽略不计),从而不会形成这方面的页面滑动卡顿。当然,有图片加载,或item布局类型较多,或者有其他耗时操作的除外。


这里推荐一个类,listview嵌套listview的类,当然,这么做的话,页面显示时正常,但是最终的结果页面有点小卡,体验性能不好......


public class MyListView extends ListView {public MyListView(Context context) {super(context);}public MyListView(Context context, AttributeSet attrs) {super(context, attrs);}public MyListView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);}    @Override<pre name="code" class="java">    SpannableStringBuilder builder = new SpannableStringBuilder();            for (int i = 0; i < entities.get(position).getDrawInfos().size(); i++) {                for (int j = 0; j < entities.get(position).getDrawInfos().get(i).getDrawResutSp().size(); j++) {                    builder                            .append(entities.get(position).getDrawInfos().get(i).getGameNo())                            .append(entities.get(position).getDrawInfos().get(i).getDrawResutSp().get(j).getResult().getMessage());                    String dl = String.valueOf(entities.get(position).getDrawInfos().get(i).getDrawResutSp().get(j).getSp());                    int len = dl.length();                    SpannableString SS = new SpannableString(dl);                    ForegroundColorSpan colSpan = new ForegroundColorSpan((context.getResources().getColor(R.color.sample_no)));                    SS.setSpan(colSpan, 0, len, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);                    builder.append("(").append(SS).append(")");                    if (!(i == entities.get(position).getDrawInfos().size()-1 && j == entities.get(position).getDrawInfos().get(i).getDrawResutSp().size() - 1)) {                        builder.append("\n");                    }                    holder.oddTv.setText( builder);                }            }

protected void onLayout(boolean changed, int l, int t, int r, int b) { super.onLayout(changed, l, t, r, b); } @Overridepublic void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, expandSpec);}}


我遇到的情况有点复杂,是三层listviw嵌套,即listview0嵌套(listview1嵌套(listview2))

嵌套两层都已经很是复杂痛疼,更何况是三层。

我的解决方案就是用一个textview去代替内层的两层嵌套的listview。这里,我用到了SpannableStringBuilder    ,思路就是将两层嵌套的listview数据利用量程for循环遍历出来,在结合SpannableStringBuilder  ,就做出了类似三层listview嵌套的效果


    SpannableStringBuilder builder = new SpannableStringBuilder();            for (int i = 0; i < entities.get(position).getDrawInfos().size(); i++) {                for (int j = 0; j < entities.get(position).getDrawInfos().get(i).getDrawResutSp().size(); j++) {                    builder                            .append(entities.get(position).getDrawInfos().get(i).getGameNo())                            .append(entities.get(position).getDrawInfos().get(i).getDrawResutSp().get(j).getResult().getMessage());                    String dl = String.valueOf(entities.get(position).getDrawInfos().get(i).getDrawResutSp().get(j).getSp());                    int len = dl.length();                    SpannableString SS = new SpannableString(dl);                    ForegroundColorSpan colSpan = new ForegroundColorSpan((context.getResources().getColor(R.color.sample_no)));                    SS.setSpan(colSpan, 0, len, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);                    builder.append("(").append(SS).append(")");                    if (!(i == entities.get(position).getDrawInfos().size()-1 && j == entities.get(position).getDrawInfos().get(i).getDrawResutSp().size() - 1)) {                        builder.append("\n");                    }                    holder.oddTv.setText( builder);                }            }

当然,也肯定有高手能解决三层listview的嵌套,但是想要页面不卡顿真的很难呢,我是咩有做到,欢迎大神指点........就写到这里了,不是所有的listview嵌套情况都适用哦!!!


0 0
原创粉丝点击