android 适配器模式(二)添加适配器
1.搭建适配器 继承 BaseAdapter
public class CircleMenuAdapter extends BaseAdapter { private List<Menu> list; public CircleMenuAdapter(List<Menu> list) { this.list = list; } @Override public int getCount() { return list.size(); } @Override public Object getItem(int position) { return position; } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { LayoutInflater inflater = LayoutInflater.from(parent.getContext()); View view = inflater.inflate(R.layout.circle_menu_item,parent,false); initMenuItem(view,position); return view; } private void initMenuItem(View v,int p) { Menu menu = list.get(p); TextView textView = v.findViewById(R.id.circle_menu_text); ImageView img = v.findViewById(R.id.circle_menu_img); textView.setText(menu.text); Log.d("text",menu.text); img.setImageResource(menu.imgId); } }
2.向viewgroup添加适配器
public class CircleMenuLayout extends ViewGroup { private int mRadius; //子布局默认的尺寸 private static final float RADIUS_CHILD_ITEM = 1/4f; private static final float RADIUS_PADDING = 1/12f; private float padding; private double startAngle; private CircleMenuAdapter adapter; public void setCircleAdapter(CircleMenuAdapter adapter){ this.adapter = adapter; } public CircleMenuLayout(Context context, AttributeSet attrs) { super(context, attrs); setPadding(0,0,0,0); } @Override protected void onAttachedToWindow() { if (adapter != null){ buildMenuItem(); } super.onAttachedToWindow(); } private void buildMenuItem(){ for (int i=0;i<adapter.getCount();++i){ View itemView = adapter.getView(i,null,this); addView(itemView); } } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); measureSelf(widthMeasureSpec,heightMeasureSpec); measureChildItem(); } private void measureSelf(int widthMeasureSpec, int heightMeasureSpec){ int resWidth; int resHeight; int width = MeasureSpec.getSize(widthMeasureSpec); int widthMode = MeasureSpec.getMode(widthMeasureSpec); int height = MeasureSpec.getSize(heightMeasureSpec); int heightMode = MeasureSpec.getMode(heightMeasureSpec); if (widthMode == MeasureSpec.EXACTLY || heightMode == MeasureSpec.EXACTLY){ resWidth = getSuggestedMinimumWidth(); resWidth = resWidth == 0 ? getWidth() : resWidth; resHeight = getSuggestedMinimumHeight(); resHeight = resHeight == 0 ? getHeight() : resHeight; }else { resWidth = resHeight = Math.min(width,height); } setMeasuredDimension(resWidth,resHeight); } private void measureChildItem(){ mRadius = Math.max(getMeasuredWidth(),getMeasuredHeight()); int childSize = (int) (mRadius * RADIUS_CHILD_ITEM); int childMode = MeasureSpec.EXACTLY; for (int i=0;i<adapter.getCount();++i){ View childView = getChildAt(i); int measureChild = -1; measureChild = MeasureSpec.makeMeasureSpec(childSize,childMode); childView.measure(measureChild,measureChild); } padding = mRadius * RADIUS_PADDING; } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { int childCount = adapter.getCount(); int left,top; int angleDelay = 360/childCount; int itemWidth = (int) (mRadius*RADIUS_CHILD_ITEM); for (int i=0;i<adapter.getCount();++i){ View childView = getChildAt(i); startAngle %= 360; //到中心点的距离 int distanceFromCenter = (int) (mRadius/2 - itemWidth/2 - padding); left = mRadius/2 + (int) (Math.round(distanceFromCenter*Math.cos(Math.toRadians(startAngle)))-1/2f*itemWidth); top = mRadius/2 + (int)(Math.round(distanceFromCenter*Math.sin(Math.toRadians(startAngle)))-1/2f*itemWidth); childView.layout(left,top,left+itemWidth,top+itemWidth); startAngle+=angleDelay; } } }
效果图
其实(一)(二)的效果是一样的,这里就不做详细介绍了。