給GridView設(shè)置單元格分割線有兩種方法侣监,一種是設(shè)置背景圖片設(shè)置分割線骏全,另外一種是自定義GridView重繪視圖設(shè)置分割線。重繪方法代碼如下:
public class LineGridView extends GridView{
public LineGridView(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
public LineGridView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public LineGridView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void dispatchDraw(Canvas canvas){
super.dispatchDraw(canvas);
View localView1 = getChildAt(0);
int column = getWidth() / localView1.getWidth();
int childCount = getChildCount();
Paint localPaint;
localPaint = new Paint();
localPaint.setStyle(Paint.Style.STROKE);
localPaint.setColor(getContext().getResources().getColor(R.color.grid_line));
for(int i = 0;i < childCount;i++){
View cellView = getChildAt(i);
if((i + 1) % column == 0){
canvas.drawLine(cellView.getLeft(), cellView.getBottom(), cellView.getRight(), cellView.getBottom(), localPaint);
}else if((i + 1) > (childCount - (childCount % column))){
canvas.drawLine(cellView.getRight(), cellView.getTop(), cellView.getRight(), cellView.getBottom(), localPaint);
}else{
canvas.drawLine(cellView.getRight(), cellView.getTop(), cellView.getRight(), cellView.getBottom(), localPaint);
canvas.drawLine(cellView.getLeft(), cellView.getBottom(), cellView.getRight(), cellView.getBottom(), localPaint);
}
}
if(childCount % column != 0){
for(int j = 0 ;j < (column-childCount % column) ; j++){
View lastView = getChildAt(childCount - 1);
canvas.drawLine(lastView.getRight() + lastView.getWidth() * j, lastView.getTop(), lastView.getRight() + lastView.getWidth()* j, lastView.getBottom(), localPaint);
}
}
}
}
在dispatchDraw
方法中,我們對(duì)每一個(gè)子view的邊界按照一定的方式繪上了邊框,一般一個(gè)格子只需繪制其中兩條邊返劲,需要注意的是最邊上的格子需要特殊處理。super.dispatchDraw(canvas);
一定要調(diào)用栖茉,不然格子中的內(nèi)容(子view)就得不到繪制的機(jī)會(huì)篮绿。
仔細(xì)看代碼你會(huì)發(fā)現(xiàn)這個(gè)實(shí)現(xiàn)方式是很好的,但是代碼并不完美吕漂,因?yàn)槊織l線的繪制我們都是以第一個(gè)子view 的寬高為基準(zhǔn)的亲配,如果某個(gè)格子的高度和第一個(gè)格子不一致,那么可能出現(xiàn)錯(cuò)位惶凝。如果你能確保每個(gè)格子大小均勻吼虎,直接拿來用,否則還需要些修改苍鲜。這里是重寫的dispatchDraw
鲸睛,其實(shí)我我們重寫onDraw方法也可以得到相同的結(jié)果。要完全弄明白的話坡贺,就得看看FrameWork中GridView的源碼了。