自定義容器實現網格(九宮格)布局效果

2021-10-01 12:10:14 字數 3157 閱讀 1321

前言:在近期的專案開發中,需要在列表的item中實現網格布局的ui效果,考慮到列表的效能和布局巢狀的層次等因素,最後決定自己寫乙個支援網格布局效果的容器,直接在列表的item中使用該容器就可以支援網格(九宮格)的顯示效果。避免了在列表中巢狀列表的實現方式。

下面的類feedbasegridview支援自定義列數、行數、不同行高的ui效果,需要實現類似效果的同學可以直接複製下面的類的**到專案中,按照類的使用方式直接使用就行,簡單方便。

abstract class feedbasegridview extends framelayout 

public feedbasegridview(context context, attributeset attrs)

public feedbasegridview(context context, attributeset attrs, int defstyleattr)

/*** 根據總view數獲取總行數

** @return

*/private int getrows()

@override

protected void onmeasure(int widthmeasurespec, int heightmeasurespec)

/*** 測量子view的尺寸並更新view的top值與行數對照表的資料

*/private void onmeasurechildren(int widthmeasurespec, int heightmeasurespec)

}if (i < rows) else

}// 設定容器的高度

setmeasureddimension(widthmeasurespec, mitemrowtoplist.get(getrows()));

}@override

protected void onlayout(boolean changed, int l, int t, int r, int b)

/*** 布局所有子view的位置

*/private void layoutchildrenview()

int count = mchildrenlist.size();

for (int i = 0; i < count; i++)

}/**

* 子類在資料準備完畢以後 呼叫該方法更新頁面

*/public void notifychanged()

} else if (oldviewcount < newviewcount)

}// 更新view的資料

setchildinfo();

// 重新整理頁面

requestlayout();

}/**

* 更新子view的資料

* 保證mchildrenlist的大小和子view的數量匹配

*/private void setchildinfo()

}/**

* 新增子view

*/private void addchild()

/*** 切換日夜間的時候呼叫該方法

** @param isnightmode 是否是夜間模式

*/public void changednightmode(boolean isnightmode)

}/**

* 子類重寫此方法,用於相應日夜間切換的效果處理

* @param view 需要處理的view

* @param isnightmode 是否夜間模式

*/protected abstract void onnightmodechanged(view view, boolean isnightmode);

/*** 由子類重寫 獲取view水平方向的間距

* @return

*/public abstract int gethorizontalgap();

/*** 由子類重寫 獲取每行的列數

* 列數最少為1 使用時請確保 不要返回0

* @return

*/public abstract int getcolumns();

/*** 由子類重寫 獲取view數

* @return

*/public abstract int getcounts();

/*** 由子類重寫 獲取view豎直方向的間距

* @return

*/public abstract int getverticalgap();

/*** 由子類重寫 獲取view

* @return

*/public abstract view createchildrenview();

/*** 由子類重寫 更新子view

* @param position 當前view的位置

* @param view 當前的view

*/public abstract void updatechildrenview(view view, int position);

/*** 獲取子view的寬度,此處提供預設的,如果需要修改可以重寫

* @return int 子view的寬度

*/protected int getchildrenwidth()

}

該類被定義為抽象容器類,使用此類需要新寫容器類繼承該類並按照規範實現以下抽象方法即可。

1.gethorizontalgap() :需要重寫此方法提供每列之間的間距。

2.getcolumns() :需要重寫此方法提供每行的列數。注意:列數最少為1列,寫**時請確保不要返回0。

3.getcounts() :重寫此方法提供網格的item的總數量。

4.getverticalgap() :需要重寫此方法提供每行之間的間距。

5.createchildrenview() :重寫此方法提供需要顯示的ui效果的每個item 的view,類似於adapter的oncreateviewholder方法。

6.updatechildrenview(view view, int position) :重寫此方法用於對item的view顯示和資料更新,類似於adapter的onbindviewholder方法。

最後在使用的類裡面,呼叫 該類的notifychanged() 方法觸發九宮格效果的載入和view的顯示更新。

實現就是如此簡單,see you 

網格布局 九宮格布局

寫三欄布局竟然忘了網格,把它加上,以及實現九宮格布局 網格布局 網格布局 right grid left content right left content right 九宮格布局使用table實現九宮格 123 4 5 67 8 9 body table table td table td sp...

九宮格布局

2009 08 25 15 15 27 九宮格是一種比較古老的設計,它最基本的表現其實就像是乙個三行三列的 其實它最初是在window的c s結構中用得比較多,比如我們經常看 到軟體中的乙個窗體,其實就是乙個九宮格的典型應用,因為窗體需要在八個方向拉伸,所以在c s軟體中大量採用這種技術來布局設計。...

自定義九宮格載入的實現

要完成自定義載入的九宮格的步驟 1 寫乙個類繼承viewgroup,同時實現他的構造方法,當然自己使用實現兩個就完全可以了,不要忘了viewgroup還有乙個必須實現的方法onlaout public classsudokuextendsviewgrouppublicsudoku context c...