listview巢狀listview的替換解決方案(適用於個別情況)
阿新 • • 發佈:2019-01-10
按照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);
}
}