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 stubTypedArray 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的LinearyoutLinearLayout 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() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubfinal int index = (Integer) v.getTag(R.id.index);// 取得要加载的数据的下标MyGridView gridView = (MyGridView) v.getTag();//获取gridviewfinal List<MenuBean.MenuChildBean> childList = CusMenu.this.list.get(index).childList;//如果子菜单为空或者子菜单的size是0,childIndex返回-1if(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() {@Overridepublic 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 ){//遍历每行的gridviewif(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>() {@Overridepublic 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));}@Overridepublic 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);}}@Overridepublic 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;}@Overridepublic long getItemId(int position) {// TODO Auto-generated method stubreturn 0;}@Overridepublic Object getItem(int position) {// TODO Auto-generated method stubreturn null;}@Overridepublic int getCount() {// TODO Auto-generated method stubreturn list.size();}}public void hiddenChildMenu(){for( MyGridView myGridView : gridviewList ){//遍历每行的gridviewmyGridView.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

旅行,重复一个承诺和梦想,听他第二十八次提起童年往事,

Android 二级菜单最终版

相关文章:

你感兴趣的文章:

标签云: