Android 长按Listview 每个item底部弹出菜单
来源:互联网 发布:如何弄死一个淘宝店铺 编辑:程序博客网 时间:2024/05/22 21:45
android界面中,有一个功能是点击listview的每个item,下方弹出两个菜单,可以点击进入别的界面,这个功能可以使用开源项目expandablelistview,的确是可以实现,但发现导入的代码过多,显得很臃肿,经过师傅指点,我采用的是如下方法,步骤如下:
1.新建一个listview,需要在外层套一层scrollview,不过使用scrollview会导致listview的高度只有一个item,需要使用自定义的listview,代码如下:
package allone.verbank.apad.client.component.fixedListView;import android.content.Context;import android.util.AttributeSet;import android.view.View.MeasureSpec;import android.widget.ListView;public class PriceListViewScroll extends ListView {public PriceListViewScroll(Context context) {super(context);}public PriceListViewScroll(Context context, AttributeSet attrs) {super(context, attrs);}public PriceListViewScroll(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);}@Overridepublic void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,MeasureSpec.AT_MOST);super.onMeasure(widthMeasureSpec, expandSpec);}}listview的界面文件如下:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@color/background" android:orientation="vertical" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center_horizontal" android:text="***" android:textColor="@color/white" android:textSize="16sp" /> <ScrollView android:id="@+id/price_scroll" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@color/background" > <allone.verbank.apad.client.component.fixedListView.PriceListViewScroll android:id="@+id/price_quote_list" android:layout_width="fill_parent" android:layout_height="fill_parent" android:divider="@color/white" > </allone.verbank.apad.client.component.fixedListView.PriceListViewScroll> </ScrollView></LinearLayout>2.每个item下方的菜单,其实原来是一开始隐藏一段view,有一定的高度,防止菜单,菜单则是使用popuwindow来弹出,item的xml文件如下:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/below_layout" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_margin="10dp" android:background="@color/background" android:orientation="vertical" > <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_margin="5dp" android:orientation="vertical" > <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <TextView android:id="@+id/price_quote_inst" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="0.98" android:gravity="right" android:singleLine="true" android:text="WYB/TEST" android:textColor="@color/white" android:textSize="20dp" > </TextView> </LinearLayout> <View android:layout_width="fill_parent" android:layout_height="1.2px" android:layout_marginLeft="14dp" android:layout_marginRight="14dp" android:layout_marginTop="5dp" android:background="@color/white" /> <TextView android:id="@+id/hidepricemenu" android:layout_width="fill_parent" android:layout_height="30dp" android:visibility="gone" /><!--这是非常关键,菜单弹出来的时候,显示,没有菜单的时候为隐藏的 --></LinearLayout>
3.下一步就是在代码中,当长按listview时就显示hidepricemenu这个textview,以便于弹出菜单,菜单是使用popuwindow来显示,如下关键代码:
list.setOnItemLongClickListener(new OnItemLongClickListener() {@Overridepublic boolean onItemLongClick(AdapterView<?> arg0, View sourView,final int arg2, long arg3) {hidepricemenu = (TextView) sourView.findViewById(R.id.hidepricemenu);hidepricemenu.setVisibility(View.VISIBLE);String selectIntrument = maps.get(arg2).get(PRICE_TC_INST).toString();buysellLongClickAction(sourView, selectIntrument, hidepricemenu);return true;}});private void buysellLongClickAction(final View inner,final String instname, final TextView hide_PriceMenu_copy) {StaticContext.TRADE_INST = instname;if (popupMenu != null) {popupMenu.destroyPopupMenu();}// 浮出菜单popupMenu = PopupMenuFactory.createPopupWindow(getSelfActivity(),inner, IPopupMenu.MENU_ID_PRICE, instname);popupMenu.showPopupMenu();popupMenu.createPupupWindow().setOnDismissListener(new PopupWindow.OnDismissListener() {@Overridepublic void onDismiss() {hide_PriceMenu_copy.setVisibility(View.GONE);}});// 当为最后一行的时候,弹出的菜单会被隐藏,这里使用scroll向上移动handler.post(new Runnable() {@Overridepublic void run() {if (price_scroll.getScrollY() > 40) {price_scroll.scrollTo(0, price_scroll.getScrollY() + 200);}}});}
创建popuwindow的代码如下:
package allone.verbank.apad.client.component.menu.impl;import java.util.ArrayList;import java.util.HashMap;import java.util.Map;import allone.verbank.apad.client.R;import allone.verbank.apad.client.StaticContext;import allone.verbank.apad.client.component.menu.IPopupMenu;import allone.verbank.apad.client.doc.DocCaptain;import allone.verbank.apad.client.doc.IBundleCommData;import allone.verbank.apad.client.event.IStationEventName;import allone.verbank.apad.client.event.StationEventCaptain;import allone.verbank.apad.client.event.StationEventData;import allone.verbank.apad.client.frame.main.MainActivity;import android.annotation.SuppressLint;import android.app.Activity;import android.graphics.drawable.ColorDrawable;import android.view.MotionEvent;import android.view.View;import android.view.View.OnClickListener;import android.view.ViewGroup;import android.view.ViewGroup.LayoutParams;import android.view.WindowManager;import android.widget.BaseAdapter;import android.widget.Button;import android.widget.ListView;import android.widget.PopupWindow;public class PriceTradePopupMenu implements IPopupMenu {private ArrayList<Map<String, Integer>> dataMap = new ArrayList<Map<String, Integer>>();public static final String TABLE_COLUMNID_ORDERTRADE = "ORDERTRADE";public static final String TABLE_COLUMNID_PRICEWARNING = "PRICEWARNING";private ListView listview;private PopupWindow popupMenu;private MainActivity activity;private View sourceView;private String instrument;public PriceTradePopupMenu(Activity activity, View sourceView, Object data) {this.activity = (MainActivity) activity;this.sourceView = sourceView;instrument = data.toString();initComponent();}private void initComponent() {View view = activity.getLayoutInflater().inflate(R.layout.popup_price_menu, null);listview = (ListView) view.findViewById(R.id.price_menu_list);addRowData();PriceTradeAdapter listAdapter = new PriceTradeAdapter();listview.setAdapter(listAdapter);// 创建弹出窗口// 窗口内容为layoutLeft,里面包含一个ListView// 窗口宽度跟tvLeft一样WindowManager wm = activity.getWindowManager();int width = wm.getDefaultDisplay().getWidth();// width -// sourceView.getWidth()popupMenu = new PopupWindow(view, sourceView.getWidth(),LayoutParams.WRAP_CONTENT);ColorDrawable cd = new ColorDrawable(R.color.white);popupMenu.setBackgroundDrawable(cd);// popupMenu.setAnimationStyle(R.style.AnimationFade);popupMenu.update();popupMenu.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED);popupMenu.setTouchable(true); // 设置popupwindow可点击popupMenu.setOutsideTouchable(true); // 设置popupwindow外部可点击popupMenu.setFocusable(true); // 获取焦点popupMenu.setTouchInterceptor(new View.OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {// 如果点击了popupwindow的外部,popupwindow也会消失StationEventCaptain.getInstance().fireEventDataChange(new StationEventData(IStationEventName.EVENT_NAME_PRICE_MENU_CHANGE,instrument));if (event.getAction() == MotionEvent.ACTION_OUTSIDE) {popupMenu.dismiss();return true;}return false;}});}private void addRowData() {dataMap.add(addRowItemData());}private HashMap<String, Integer> addRowItemData() {HashMap<String, Integer> mapTemp = new HashMap<String, Integer>();mapTemp.put(TABLE_COLUMNID_ORDERTRADE,IBundleCommData.MENU_PRICE_ORDERTRADE);mapTemp.put(TABLE_COLUMNID_PRICEWARNING,IBundleCommData.MENU_PRICE_PRICEWARNING);return mapTemp;}@Overridepublic PopupWindow createPupupWindow() {return popupMenu;}@Overridepublic void destroyPopupMenu() {if (popupMenu != null && popupMenu.isShowing()) {popupMenu.dismiss();}}@SuppressLint("NewApi")@Overridepublic void showPopupMenu() {if (popupMenu != null && popupMenu.isShowing()) {popupMenu.dismiss();} else {popupMenu.showAsDropDown(sourceView, 10,-50 + (int) sourceView.getRotationY());}}public class PriceTradeAdapter extends BaseAdapter {@Overridepublic int getCount() {return dataMap.size();}@Overridepublic Object getItem(int position) {return position;}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder viewHolder = null;if (convertView == null) {viewHolder = new ViewHolder();convertView = activity.getLayoutInflater().inflate(R.layout.popup_price_menu_item, null);viewHolder.orderTradeView = (Button) convertView.findViewById(R.id.price_menu_item_ordertrade);viewHolder.orderTradeView.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {if (popupMenu != null) {popupMenu.setAnimationStyle(0);popupMenu.dismiss();}}});convertView.setTag(viewHolder);} else {viewHolder = (ViewHolder) convertView.getTag();}int orderTrade = Integer.parseInt(dataMap.get(position).get(TABLE_COLUMNID_ORDERTRADE).toString());viewHolder.orderTradeView.setText(orderTrade == IBundleCommData.MENU_PRICE_ORDERTRADE ? activity.getString(R.string.pricetradepopupmenu_order) : "");int priceWarning = Integer.parseInt(dataMap.get(position).get(TABLE_COLUMNID_PRICEWARNING).toString());viewHolder.priceWarningView.setText(priceWarning == IBundleCommData.MENU_PRICE_PRICEWARNING ? activity.getString(R.string.pricetradepopupmenu_pricewarnning): "");return convertView;}private class ViewHolder {Button orderTradeView;Button priceWarningView;}}}
4.使用这种方式的时候,当最后一个item,会出现弹出的菜单在listview的下方的,位置被遮挡住了,所以需要前面scrollview,判断下方的高度,然后进行listview的移动,使用scrollto的方法,如下代码:
// 当为最后一行的时候,弹出的菜单会被隐藏,这里使用scroll向上移动if (price_scroll.getScrollY() > 10) {price_scroll.scrollTo(0, price_scroll.getScrollY() + 200);}if (price_scroll.getScrollY() == 0) {price_scroll.scrollTo(0, price_scroll.getScrollY() + 50);}
至此就可以完成该功能,有些代码省略了,因为是公司的,有问题可以交流!!!
0 0
- Android 长按Listview 每个item底部弹出菜单
- Android ListView长按事件弹出菜单并获取选中的item
- 长按listview弹出菜单
- 长按listview弹出上下文菜单实现
- ListView:长按弹出上下文菜单(ContextMenu)
- 长按listview弹出上下文菜单实现
- ListView长按弹出菜单项
- android底部弹出菜单
- android 底部弹出菜单
- Android之ListView长按列表项弹出菜单 给菜单项添加事件 获取上下文
- listview长按弹出菜单并响应菜单事件
- android: 长按删除listview的item
- Android ListView长按Item功能
- 注册一个 长按listView的item弹出选择列表
- android listview 长按弹出菜单--ContextMenu并进行删除操作
- android 组件长按弹出上下文菜单
- 长按弹出菜单
- ListView单击和长按弹出上下文菜单(ContextMenu)
- 超酷算法:日志结构化存储
- 第十周项目—阅读程序,写出执行结果(1)
- tar (child): lbzip2: Cannot exec: No such file or
- ubuntu13.10搭建Jenkins
- Android 中多线程的简单使用
- Android 长按Listview 每个item底部弹出菜单
- ASP.NET My97DatePicker日期控件实现OA日期记事功能
- Linux下安装QT之版本qt-4.6.3
- struts2 中,如何覆盖默认的错误消息
- 将rdd存储到本地的一个文件中
- Java基础知识网络编程(TCP练习)
- mysql 给指定用户指定数据库
- Web自动化系列--Selenium WebDriver详细介绍
- ReactNative NodeJs v5.7.0稳定版官方下载