Android 長按Listview 每個item底部快顯功能表

來源:互聯網
上載者:User

標籤:

    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);}

至此就可以完成該功能,有些代碼省略了,因為是公司的,有問題可以交流!!!

Android 長按Listview 每個item底部快顯功能表

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.