Android 二级菜单最终版

上个图:

技术分享

终于有个了断了,之前因为自己分析不到位,导致了之前的二级菜单有点问题,所以重新思考了下,改成现在这个样子,利用神奇的点9图片,实现这个效果。

总是来说,就是将被点击的背景图改变,那个小箭头其实就是被点击项的背景图,而下面是gridview,因为靠的比较近,看起来是连在一起的。看代码:

CusMenu.java

package com.example.twolevelmenu;

import java.util.ArrayList;
import java.util.List;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.example.twolevelmenu.MenuBean.MenuChildBean;
import com.lidroid.xutils.BitmapUtils;
import com.lidroid.xutils.bitmap.BitmapDisplayConfig;
import com.lidroid.xutils.bitmap.callback.BitmapLoadCallBack;
import com.lidroid.xutils.bitmap.callback.BitmapLoadFrom;

public class CusMenu extends LinearLayout {

	/**
	 * 列数
	 */
	private int colum = 3;
	
	/**
	 * 加载数据的下标
	 */
	private int index;
	
	/**
	 * 记录点击的id
	 */
	private int id;
	
	private BitmapUtils bitmapUtils = null;
	
	/**
	 * 相关数据源和view
	 */
	private List<MenuBean> list;
	private List<MyGridView> gridviewList = new ArrayList<MyGridView>();
	private List<LinearLayout> linearLayoutList = new ArrayList<LinearLayout>();


	public CusMenu(Context context) {
		super(context);
	}

	public CusMenu(Context context, AttributeSet attrs) {
		super(context, attrs);
		// TODO Auto-generated constructor stub
		TypedArray a = context.obtainStyledAttributes(attrs,
				R.styleable.CusMenu);
		colum = a.getInt(R.styleable.CusMenu_colum, 3);
		a.recycle();
		//setBackgroundResource(R.drawable.order_list_04);
	}

	public void init(List<MenuBean> list) {
		if (list == null || list.size() == 0)
			return;
		this.setOrientation(LinearLayout.VERTICAL);
		this.setBackgroundColor(getResources().getColor(android.R.color.white));
		if(bitmapUtils == null){
			bitmapUtils = new BitmapUtils(getContext());
			bitmapUtils.configDefaultLoadingImage(R.drawable.ic_launcher);
			bitmapUtils.configDefaultLoadFailedImage(R.drawable.ic_launcher);
			bitmapUtils.configDefaultBitmapConfig(Bitmap.Config.RGB_565);
		}

		this.list = list;
		int row = 0;
		int size = this.list.size();
		// 计算行数
		if (size % colum == size) {// 和列数取余,等于本身说明不够一行
			row = 1;
		} else if (size % colum == 0) {// 等于0说明刚好除尽,直接除
			row = size / colum;
		} else {// 超过,+1行
			row = size / colum + 1;
		}
		
		for (int i = 1; i <= row; i++) {
			// 每一行的布局,包含colum个列布局
			LinearLayout rowLinearLayout = new LinearLayout(getContext());
			LinearLayout.LayoutParams rowLinearLayoutParams = new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT);
			rowLinearLayoutParams.setMargins(0, 20, 0, 0);
			rowLinearLayout.setLayoutParams(rowLinearLayoutParams);
			rowLinearLayout.setOrientation(LinearLayout.HORIZONTAL);
			rowLinearLayout.setGravity(Gravity.CENTER_HORIZONTAL|Gravity.CENTER_VERTICAL);
			rowLinearLayout.setBackgroundColor(getResources().getColor(android.R.color.white));
			if(i == 1){//第一行上方应该留出更多空间
				rowLinearLayout.setPadding(0, 30, 0, 0);
			}else{
				rowLinearLayout.setPadding(0, 20, 0, 0);
			}
			//rowLinearLayout.setPadding(0, 20, 0, 0);
			// 每一行布局下面隐藏一个gridview,显示子菜单
			MyGridView rowGridView = new MyGridView(getContext());
			rowGridView.setNumColumns(colum);
			rowGridView.setHorizontalSpacing(0);
			rowGridView.setVerticalSpacing(2);
			rowGridView.setVisibility(View.GONE);
			rowGridView.setId(i+1000);//1000为随便给的数,防止id重复
			//rowGridView.setPadding(0, 5, 0, 0);
			rowGridView.setSelector(new ColorDrawable(Color.TRANSPARENT));
			rowGridView.setBackgroundColor(Color.rgb(230, 230, 230));
			LinearLayout.LayoutParams rowGridViewParams = new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
			rowGridViewParams.setMargins(10, 0, 10, 0);
			rowGridView.setLayoutParams(rowGridViewParams);
			gridviewList.add(rowGridView);
			this.addView(rowLinearLayout);
			this.addView(rowGridView);

			for (int j = 1; j <= colum; j++) {
				// 每一列的布局,包含Imageview和Textview
				// 创建包含Imageview和Textview的Linearyout
				LinearLayout columLinearLayout = new LinearLayout(getContext());
				columLinearLayout.setOrientation(LinearLayout.VERTICAL);
				LinearLayout.LayoutParams columLinearLayoutParams = new LayoutParams(
						0, LayoutParams.WRAP_CONTENT, 1);
				columLinearLayoutParams.gravity = Gravity.CENTER_HORIZONTAL|Gravity.CENTER_VERTICAL;
				columLinearLayout.setLayoutParams(columLinearLayoutParams);
				columLinearLayout.setGravity(Gravity.CENTER_HORIZONTAL|Gravity.CENTER_VERTICAL);
				linearLayoutList.add(columLinearLayout);

				if (index < size) {
					
					columLinearLayout.setTag(R.id.index, index);
					columLinearLayout.setTag(rowGridView);
					columLinearLayout.setId(index);
					columLinearLayout.setOnClickListener(new OnClickListener() {

						@Override
						public void onClick(View v) {
							// TODO Auto-generated method stub
							final int index = (Integer) v.getTag(R.id.index);// 取得要加载的数据的下标
							MyGridView gridView = (MyGridView) v.getTag();//获取gridview
							final List<MenuBean.MenuChildBean> childList = CusMenu.this.list.get(index).childList;
							//如果子菜单为空或者子菜单的size是0,childIndex返回-1
							if(childList==null||childList.size() == 0){
								if (onChildGridViewItemClick != null) {
									onChildGridViewItemClick.onItemClick(
											index, -1);
								}
								gridView.setVisibility(View.GONE);
								id = v.getId();// 记录点击的父菜单
								return;
							}else{
								resetLinearLayoutBg();
								v.setBackgroundResource(R.drawable.newmain_colum_bg);
							}
							
							//子菜单的监听,回调
							gridView.setOnItemClickListener(new OnItemClickListener() {

								@Override
								public void onItemClick(AdapterView<?> parent,
										View view, int position, long id) {
									if (onChildGridViewItemClick != null && childList.get(position) != null) {
										onChildGridViewItemClick.onItemClick(
												index, position);
									}
								}
							});
							//子菜单还没显示
							if (gridView.getVisibility() == View.GONE) {
								gridView.setVisibility(View.VISIBLE);//显示子菜单
								for( MyGridView myGridView : gridviewList ){//遍历每行的gridview
									if(gridView.getId() != myGridView.getId()){//若不是此行的gridview,隐藏
										myGridView.setVisibility(View.GONE);
									}
								}
								if (gridView.getAdapter() == null) {
									gridView.setAdapter(new Adapter(childList));
								} else {
									((Adapter) gridView.getAdapter()).changeList(childList);
								}
							} else {
								if (id == v.getId()) {// 此处判断是否点击同一父菜单,是的话隐藏子菜单,否则更新子菜单
									gridView.setVisibility(View.GONE);
									v.setBackgroundResource(R.drawable.newmain_colum_bg_nor);
								} else {
									((Adapter) gridView.getAdapter()).changeList(childList);
								}
							}
							id = v.getId();// 记录点击的父菜单
						}
					});
					
					ImageView columImageView = new ImageView(getContext());
					columImageView.setScaleType(ScaleType.FIT_XY);
					final int width = (int) (ScreenInfo.screenWidth * 0.185);//0.185为图片占屏幕的比例
					LinearLayout.LayoutParams imgParams = new LayoutParams(
							width, width);
					imgParams.setMargins(0, 0, 0, 10);
					imgParams.gravity = Gravity.CENTER_HORIZONTAL|Gravity.CENTER_VERTICAL;
					columImageView.setLayoutParams(imgParams);
					MenuBean menuBean = CusMenu.this.list.get(index);
					//图片加载顺序 网络>本地>默认
					if(menuBean.logo_url!=null && menuBean.logo_url.length() > 0){//若有网络图片
						bitmapUtils.display(columImageView, menuBean.logo_url,new BitmapLoadCallBack<View>() {

							@Override
							public void onLoadCompleted(View container,
									String uri, Bitmap bitmap,
									BitmapDisplayConfig config,
									BitmapLoadFrom from) {
								// TODO Auto-generated method stub
								((ImageView)container).setImageBitmap(bitmap);//cutterBitmap(bitmap, width, width));
							}

							@Override
							public void onLoadFailed(View container,
									String uri, Drawable drawable) {
								// TODO Auto-generated method stub
								
							}
						});
					}else if(menuBean.logo_id != 0){//若有本地图片
						columImageView.setImageResource(menuBean.logo_id);
					}else{//默认图片
						columImageView.setImageResource(R.drawable.newmain_icon5);
					}
					
					TextView columTextView = new TextView(getContext());
					columTextView.setGravity(Gravity.CENTER_HORIZONTAL|Gravity.CENTER_VERTICAL);
					columTextView.setText(this.list.get(index).desc);
					columTextView.setTextColor(getResources().getColor(android.R.color.black));
					// 添加到列布局
					columLinearLayout.addView(columImageView);
					columLinearLayout.addView(columTextView);
				} else {
					// 添加到行布局
					columLinearLayout.setVisibility(View.INVISIBLE);
				}
				rowLinearLayout.addView(columLinearLayout);
				index++;
			}
		}
	}
	
	class Adapter extends BaseAdapter {

		private List<MenuChildBean> list;

		public Adapter(List<MenuChildBean> childList) {
			this.list = childList;
			checkList();
		}

		public void changeList(List<MenuChildBean> list) {
			this.list = list;
			checkList();
			notifyDataSetChanged();
		}
		
		private void checkList(){
			int remainder = list.size()%colum;
			if(remainder == 0)return;
			for(int i = remainder; i < colum ; i ++){
				list.add(null);
			}
		}
		
		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			if(convertView == null){
				convertView = LayoutInflater.from(getContext()).inflate(R.layout.cusmenu_gridview_item, null);
			}
			TextView tv = ViewHolder.get(convertView, R.id.cusmenu_gridview_tv);
			tv.setTextColor(Color.rgb(70, 70, 70));
			tv.setVisibility(View.VISIBLE);
			tv.setTextSize(13);
			View line = ViewHolder.get(convertView, R.id.line);
			line.setVisibility(View.VISIBLE);
			if (list.get(position) != null) {
				tv.setText(list.get(position).desc);
			} else {
				tv.setVisibility(View.GONE);
				line.setVisibility(View.GONE);
			}
			if(position % colum == colum-1)line.setVisibility(View.GONE);
			return convertView;
		}

		@Override
		public long getItemId(int position) {
			// TODO Auto-generated method stub
			return 0;
		}

		@Override
		public Object getItem(int position) {
			// TODO Auto-generated method stub
			return null;
		}

		@Override
		public int getCount() {
			// TODO Auto-generated method stub
			return list.size();
		}
	}
	
	public void hiddenChildMenu(){
		for( MyGridView myGridView : gridviewList ){//遍历每行的gridview
			myGridView.setVisibility(View.GONE);
		}
	}
	
	public void resetLinearLayoutBg(){
		for(LinearLayout linerLayout :linearLayoutList){
			linerLayout.setBackgroundResource(R.drawable.newmain_colum_bg_nor);
		}
	}
	
	private OnChildGridViewItemClick onChildGridViewItemClick;

	public void setOnChildGridViewItemClick(
			OnChildGridViewItemClick onChildGridViewItemClick) {
		this.onChildGridViewItemClick = onChildGridViewItemClick;
	}

	public interface OnChildGridViewItemClick {
		void onItemClick(int parentIndex, int childIndex);
	}
}
MenuActivity.java

package com.example.twolevelmenu;
import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.widget.Toast;

import com.example.twolevelmenu.R;


public class MenuActivity extends Activity{
	
	private List<MenuBean> list = new ArrayList<MenuBean>();
	private CusMenu cusMenu;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		ScreenInfo.initScreent(this);
		cusMenu=new CusMenu(this);
		//cusMenu.setImageName("a", ".png");
		setContentView(cusMenu);
		getDataTest();
	}
	
	private void getDataTest() {
		for (int i = 0; i < 5; i++) {
			MenuBean bean = new MenuBean();
			bean.desc = "插件" + i;
			bean.logo_id = R.drawable.newmain_icon5;
			bean.logo_url = "";
			List<MenuBean.MenuChildBean> childList = new ArrayList<MenuBean.MenuChildBean>();
			for(int j=0;j<=i;j++){
				MenuBean.MenuChildBean childBean = bean.new MenuChildBean();
				childBean.desc="子菜单"+j;
				childList.add(childBean);
			}
			bean.childList=childList;
			list.add(bean);
		}
		cusMenu.init(list);
		cusMenu.setOnChildGridViewItemClick(new CusMenu.OnChildGridViewItemClick() {
			
			@Override
			public void onItemClick(int parentIndex, int childIndex) {
				// TODO Auto-generated method stub
				Toast.makeText(getApplicationContext(), parentIndex+"--"+childIndex, Toast.LENGTH_SHORT).show();
			}
		});
	}
	
}

具体看demo,点此下载

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。