公司项目里的需求,商城的左下角,要求有分类的Menu。
看图:
![Menu效果图 Menu效果图](http://img.app-edu.net/attachment/portal/201308/et153376230440191.png)
1.当点击一级分类,修改二级菜单里面的内容。
2.同时一级菜单里的背景变为右边有白色三角的背景。
3.当点击二级菜单的条目时候,Popupwindow消失,并且界面更新对应条目的商品数据。
我的实现思路是:左下角弹出Popupwindow,里面使用两个ListView实现。
我的Demo的效果:
1,点击一级菜单分类,修改二级菜单里面的内容:
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1,
int position, long arg3) {
final int location = position;
myAdapter.setSelectedPosition(position);//adapter中的方法,将当前点击位置,告诉adapter。adapter根据position设置响应位置的数据。
myAdapter.notifyDataSetInvalidated();
subAdapter = new SubAdapter(MenuPop.this.context, cities,
images, position);
subListView.setAdapter(subAdapter);
subListView.setOnItemClickListener(new OnItemClickListener() {//二级菜单,根据一级菜单数据修改。@Override
public void onItemClick(AdapterView<?> arg0, View arg1,
int position, long arg3) {
Toast.makeText(MenuPop.this.context,
cities[location][position], Toast.LENGTH_SHORT)
.show();
}
});
}
});
2,adapter中数据设置
// 设置选中效果(改变背景图片)
if (selectedPosition == position) {
holder.textView.setTextColor(Color.BLUE);
holder.layout.setBackgroundResource(R.drawable.fenlei_blue_on);
} else {
holder.textView.setTextColor(Color.WHITE);
holder.layout.setBackgroundColor(Color.TRANSPARENT);
}
//设置数据,数据现在是固定在String数组中
if (position == 0) {
holder.imageView.setBackgroundResource(R.color.transparent);
} else if (position == 1) {
holder.imageView.setBackgroundResource(R.color.transparent);} else {
holder.imageView.setBackgroundResource(images[position]);}
3,产生Popupwindow的类,通过new该对象,得到新的Popupwindow。
//构造方法中,传入当前上下文,初始化双ListView布局,设置adapter。
public MenuPop(Context context, SecondFragmentCallback callback) {
super();
this.context = context;
this.callback = callback;View view = LayoutInflater.from(context)
.inflate(R.layout.popmenu, null);// 设置listview
listView = (MyListView) view.findViewById(R.id.listView);
subListView = (MyListView) view.findViewById(R.id.subListView);
myAdapter = new MyAdapter(context, foods, images);
listView.setAdapter(myAdapter);
selectDefult();
//Popupwindow显示位置控制
//Popupwindow菜单的隐藏方法
// showAsDropDown,默认位置在锚点的左下,如果左下没有空间,就显示在左上
public void showAsDropUp(View parent) {
popupWindow
.showAtLocation(parent, Gravity.LEFT | Gravity.BOTTOM, 0, 90);
popupWindow.showAsDropDown(parent, 0, 0);// 显示的位置
// 使其聚集
popupWindow.setFocusable(true);
// 使其允许在外点击消失
popupWindow.setOutsideTouchable(true);
// 刷新状态
popupWindow.update();
}// 隐藏菜单
public void dismiss() {
popupWindow.dismiss();
}
布局文件:Popupwindow中横向并排两个ListView;
adapter中的ListView-item左边图片,右边textview。
*****************************************
自定义的MyListView,开启子线程,动态更新UI。
class MyListView extends ListView implements Runnable == 继承ListView,实现Runnable方法。
//主要override 的方法:
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
if (mLastDownY == 0f && mDistance == 0) {
mLastDownY = event.getY();
return true;
}
break;case MotionEvent.ACTION_CANCEL:
break;case MotionEvent.ACTION_UP:
if (mDistance != 0) {
mStep = 1;
mPositive = (mDistance >= 0);
/**
* post
*
* Causes the Runnable to be added to the message queue. The
* runnable will be run on the user interface thread.
* 触发子线程被添加到消息队列事件。该子线程将运行在用户接口线程。 This method can be invoked
* from outside of the UI thread only when this View is attached
* to a window. 只有当View控件被加入一个窗体,该方法从外部UI线程被调用
*/
this.post(this);
return true;
}
mLastDownY = 0f;
mDistance = 0;
break;case MotionEvent.ACTION_MOVE:
if (mLastDownY != 0f) {
mDistance = (int) (mLastDownY - event.getY());
if ((mDistance < 0 && getFirstVisiblePosition() == 0 && getChildAt(
0).getTop() == 0)
|| (mDistance > 0 && getLastVisiblePosition() == getCount() - 1)) {
mDistance /= 2;
scrollTo(0, mDistance);
return true;
}
}
mDistance = 0;
break;
}
return super.onTouchEvent(event);
}
注:现在还是熟练代码的阶段,好多东西都不清楚啊,需要学习的太多了。