公司項目裡的需求,商城的左下角,要求有分類的Menu。
看圖:
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);
}
註:現在還是熟練代碼的階段,好多東西都不清楚啊,需要學習的太多了。
極地大亂鬥台詞:毫無異樣的感覺,只不過是風聲而已。