1. 程式人生 > >listview巢狀listview的替換解決方案(適用於個別情況)

listview巢狀listview的替換解決方案(適用於個別情況)

按照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巢狀情況都適用哦!!!