DividerGridView 优化

来源:互联网 发布:网络信息自查报告 编辑:程序博客网 时间:2024/05/21 15:44
package com.lidd.view;import android.content.Context;import android.graphics.Canvas;import android.graphics.drawable.Drawable;import android.util.AttributeSet;import android.view.View;import android.widget.GridView;public class MyDividerGridView extends GridView {    private int columnNum;    private int childNum;    private Drawable leftDividerDrawable;    private Drawable bottomDividerDrawable;    public MyDividerGridView(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);    }    public MyDividerGridView(Context context, AttributeSet attrs) {        super(context, attrs);    }    public MyDividerGridView(Context context) {        super(context);    }    public void setLeftDividerDrawable(Drawable leftDividerDrawable) {        this.leftDividerDrawable = leftDividerDrawable;    }    public void setBottomDividerDrawable(Drawable bottomDividerDrawable) {        this.bottomDividerDrawable = bottomDividerDrawable;    }    private void drawLeft(Canvas canvas,View itemView){        int top = itemView.getTop();        int bottom = itemView.getBottom()+bottomDividerDrawable.getIntrinsicHeight();        int right = itemView.getRight() + leftDividerDrawable.getIntrinsicWidth();        int left = itemView.getRight();        leftDividerDrawable.setBounds(left, top, right, bottom);        leftDividerDrawable.draw(canvas);    }    private void drawLeftLow(Canvas canvas,View itemView){        int top = itemView.getTop();        int bottom = itemView.getBottom();        int right = itemView.getRight() + leftDividerDrawable.getIntrinsicWidth();        int left = itemView.getRight();        leftDividerDrawable.setBounds(left, top, right, bottom);        leftDividerDrawable.draw(canvas);    }    private void drawBottom(Canvas canvas,View itemView){        int left = itemView.getLeft();        int  right = itemView.getRight();        int bottom = itemView.getBottom() + bottomDividerDrawable.getIntrinsicHeight();        int top = itemView.getBottom();        bottomDividerDrawable.setBounds(left, top, right, bottom);        bottomDividerDrawable.draw(canvas);    }    private boolean isLastRight(int pos,int spanClounm){        return (pos+1) % spanClounm == 0;    }    private int getColunmNum(int num,int spanClounm){        return num / spanClounm + (((num % spanClounm) > 0)? 1:0);    }    private boolean isLastBottom(int pos,int allNums,int spanClounm){        return getColunmNum(pos+1,spanClounm) == getColunmNum(allNums,spanClounm);    }    @Override    protected void dispatchDraw(Canvas canvas) {        super.dispatchDraw(canvas);        View child0 = getChildAt(0);        columnNum = getWidth() / child0.getWidth();        childNum = getChildCount();        // 底部是否需要 分割线                for (int i = 0; i < childNum; i++) {                    if(isLastRight(i,columnNum)){                        if(!isLastBottom(i,childNum,columnNum)){                            drawBottom(canvas,getChildAt(i));                        }                    }else if(isLastBottom(i,childNum,columnNum)){                        drawLeftLow(canvas,getChildAt(i));                    }else{                        drawLeft(canvas,getChildAt(i));                        drawBottom(canvas,getChildAt(i));                    }                }//      for (int i = 0; i < childNum; i++) {////          if(isLastRight(i,columnNum)){//////              drawBottom(canvas,getChildAt(i));//////          }else{////              drawLeft(canvas,getChildAt(i));//              drawBottom(canvas,getChildAt(i));//          }//      }    }}
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical" >    <com.lidd.view.MyDividerGridView        android:id="@+id/divider_grid_view_content"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:verticalSpacing="1dp"        android:horizontalSpacing="1dp"        android:listSelector="@android:color/transparent"        android:numColumns="3" /></LinearLayout>

原理:利用

 android:verticalSpacing="1dp" android:horizontalSpacing="1dp"

再画:
divider
优化点:
使得每个item的宽度都一样

0 0