Android 单击listview弹出popupwindow弹出框,里面还附带listview右滑删除按钮。有时候需要listview的每一项都可以弹出popupwindow弹出框,QQ上也有类似的效果。

附上与本文相关部分内容,因为我是在此基础上写的Android 使用NineOldAndroids实现仿微信listview左滑出现删除itembutton。

本文的项目源码地址:点击

一、先看效果图

Android 单击listview弹出popupwindow弹出框_第1张图片

二、项目结构图

Android 单击listview弹出popupwindow弹出框_第2张图片

三、看部分popup源码

1、QuickAction类是继承PopupWindows

package com.view.pop;import android.content.Context;import android.graphics.Rect;import android.graphics.drawable.Drawable;import android.widget.ImageView;import android.widget.TextView;import android.widget.ScrollView;import android.widget.RelativeLayout;import android.widget.PopupWindow.OnDismissListener;import android.view.Gravity;import android.view.LayoutInflater;import android.view.View;import android.view.View.OnClickListener;import android.view.ViewGroup.LayoutParams;import android.view.ViewGroup;import java.util.List;import java.util.ArrayList;import com.main.listviewsideslip.R;/** * QuickAction dialog, shows action list as icon and text like the one in Gallery3D app. Currently supports vertical  * and horizontal layout. *  * @author Lorensius W. L. T  *  * Contributors: * - Kevin Peck  */public class QuickAction extends PopupWindows implements OnDismissListener {private View mRootView;private ImageView mArrowUp;private ImageView mArrowDown;private LayoutInflater mInflater;private ViewGroup mTrack;private ScrollView mScroller;private OnActionItemClickListener mItemClickListener;private OnDismissListener mDismissListener;private List actionItems = new ArrayList();private boolean mDidAction;private int mChildPos;    private int mInsertPos;    private int mAnimStyle;    private int mOrientation;    private int rootWidth=0;        public static final int HORIZONTAL = 0;    public static final int VERTICAL = 1;        public static final int ANIM_GROW_FROM_LEFT = 1;public static final int ANIM_GROW_FROM_RIGHT = 2;public static final int ANIM_GROW_FROM_CENTER = 3;public static final int ANIM_REFLECT = 4;public static final int ANIM_AUTO = 5;    /**     * Constructor for default vertical layout     *      * @param context  Context     */    public QuickAction(Context context) {        this(context, VERTICAL);    }    /**     * Constructor allowing orientation override     *      * @param context    Context     * @param orientation Layout orientation, can be vartical or horizontal     */    public QuickAction(Context context, int orientation) {        super(context);                mOrientation = orientation;                mInflater  = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);        if (mOrientation == HORIZONTAL) {            setRootViewId(R.layout.popup_horizontal);        } else {            setRootViewId(R.layout.popup_vertical);        }        mAnimStyle = ANIM_AUTO;        mChildPos = 0;    }    /**     * Get action item at an index     *      * @param index  Index of item (position from callback)     *      * @return  Action Item at the position     */    public ActionItem getActionItem(int index) {        return actionItems.get(index);    }        public ViewGroup GetActionItemsGroup() {    return mTrack;    }    /** * Set root view. *  * @param id Layout resource id */public void setRootViewId(int id) {mRootView= (ViewGroup) mInflater.inflate(id, null);mTrack = (ViewGroup) mRootView.findViewById(R.id.tracks);mArrowDown = (ImageView) mRootView.findViewById(R.id.arrow_down);mArrowUp = (ImageView) mRootView.findViewById(R.id.arrow_up);mScroller= (ScrollView) mRootView.findViewById(R.id.scroller);//This was previously defined on show() method, moved here to prevent force close that occured//when tapping fastly on a view to show quickaction dialog.//Thanx to zammbi (github.com/zammbi)mRootView.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));setContentView(mRootView);}/** * Set animation style *  * @param mAnimStyle animation style, default is set to ANIM_AUTO */public void setAnimStyle(int mAnimStyle) {this.mAnimStyle = mAnimStyle;}/** * Set listener for action item clicked. *  * @param listener Listener */public void setOnActionItemClickListener(OnActionItemClickListener listener) {mItemClickListener = listener;}/** * Add action item *  * @param action  {@link ActionItem} */public void addActionItem(ActionItem action) {actionItems.add(action);String title = action.getTitle();Drawable icon = action.getIcon();View container;if (mOrientation == HORIZONTAL) {            container = mInflater.inflate(R.layout.action_item_horizontal, null);        } else {            container = mInflater.inflate(R.layout.action_item_vertical, null);        }ImageView img = (ImageView) container.findViewById(R.id.iv_icon);TextView text = (TextView) container.findViewById(R.id.tv_title);if (icon != null) {img.setImageDrawable(icon);} else {img.setVisibility(View.GONE);}if (title != null) {text.setText(title);} else {text.setVisibility(View.GONE);}final int pos =  mChildPos;final int actionId = action.getActionId();container.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {if (mItemClickListener != null) {                    mItemClickListener.onItemClick(QuickAction.this, pos, actionId);                }                if (!getActionItem(pos).isSticky()) {                  mDidAction = true;                                onDismiss();                }}});container.setFocusable(true);container.setClickable(true); //if (mOrientation == HORIZONTAL && mChildPos != 0) {//            View separator = mInflater.inflate(R.layout.horiz_separator, null);//            //            RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.FILL_PARENT);//            //            separator.setLayoutParams(params);//            separator.setPadding(5, 0, 5, 0);//            //            mTrack.addView(separator, mInsertPos);//            //            mInsertPos++;//        }mTrack.addView(container, mInsertPos);mChildPos++;mInsertPos++;}/** * Show quickaction popup. Popup is automatically positioned, on top or bottom of anchor view. *  */public void show (View anchor) {preShow();int xPos, yPos, arrowPos;mDidAction = false;int[] location = new int[2];anchor.getLocationOnScreen(location);Rect anchorRect = new Rect(location[0], location[1], location[0] + anchor.getWidth(), location[1]                 + anchor.getHeight());//mRootView.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));mRootView.measure(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);int rootHeight = mRootView.getMeasuredHeight();if (rootWidth == 0) {rootWidth= mRootView.getMeasuredWidth();}int screenWidth = mWindowManager.getDefaultDisplay().getWidth();int screenHeight= mWindowManager.getDefaultDisplay().getHeight();//automatically get X coord of popup (top left)if ((anchorRect.left + rootWidth) > screenWidth) {xPos = anchorRect.left - (rootWidth-anchor.getWidth());xPos = (xPos < 0) ? 0 : xPos;arrowPos = anchorRect.centerX()-xPos;} else {if (anchor.getWidth() > rootWidth) {xPos = anchorRect.centerX() - (rootWidth/2);} else {xPos = anchorRect.left;}arrowPos = anchorRect.centerX()-xPos;}int dyTop= anchorRect.top;int dyBottom= screenHeight - anchorRect.bottom;//boolean onTop= (dyTop > dyBottom) ? true : false;//弹出的对话框全部朝上boolean onTop= true;if (onTop) {if (rootHeight > dyTop) {yPos = 15;LayoutParams l = mScroller.getLayoutParams();l.height= dyTop - anchor.getHeight();} else {yPos = anchorRect.top - rootHeight;}} else {yPos = anchorRect.bottom;if (rootHeight > dyBottom) { LayoutParams l = mScroller.getLayoutParams();l.height= dyBottom;}}showArrow(((onTop) ? R.id.arrow_down : R.id.arrow_up), arrowPos);setAnimationStyle(screenWidth, anchorRect.centerX(), onTop);mWindow.showAtLocation(anchor, Gravity.NO_GRAVITY, xPos, yPos);}public void show (View parent, float screenX, float screenY) {preShow();int xPos, yPos, arrowPos;mDidAction = false;int widthAnchor = 10;int heightAnchor = 10;Rect anchorRect = new Rect((int)screenX - widthAnchor/2, (int)screenY - heightAnchor/2, (int)screenX + widthAnchor/2, (int)screenY + heightAnchor/2);//mRootView.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));mTrack.getMeasuredWidth();mRootView.measure(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);int rootHeight = mRootView.getMeasuredHeight();rootWidth= mRootView.getMeasuredWidth();int screenWidth = mWindowManager.getDefaultDisplay().getWidth();int screenHeight= mWindowManager.getDefaultDisplay().getHeight();//automatically get X coord of popup (top left)if ((anchorRect.left + rootWidth/2) > screenWidth) {xPos = screenWidth - rootWidth;arrowPos = anchorRect.centerX() - xPos;} else {if (widthAnchor > rootWidth) {xPos = anchorRect.centerX() - (rootWidth/2);} else {xPos = anchorRect.centerX() - rootWidth/2;if (xPos < 0) xPos = 0;}if (xPos == 0) arrowPos = anchorRect.centerX();else arrowPos = anchorRect.centerX()-xPos;}int dyTop= anchorRect.top;int dyBottom= screenHeight - anchorRect.bottom;//boolean onTop= (dyTop > dyBottom) ? true : false;boolean onTop = true;if (onTop) {if (rootHeight > dyTop) {yPos = 15;LayoutParams l = mScroller.getLayoutParams();l.height= dyTop - heightAnchor;} else {yPos = anchorRect.top - rootHeight;}} else {yPos = anchorRect.bottom;if (rootHeight > dyBottom) { LayoutParams l = mScroller.getLayoutParams();l.height= dyBottom;}}showArrow(((onTop) ? R.id.arrow_down : R.id.arrow_up), arrowPos);setAnimationStyle(screenWidth, anchorRect.centerX(), onTop);mWindow.showAtLocation(parent, Gravity.NO_GRAVITY, xPos, yPos);mWindow.update(xPos, yPos, rootWidth, rootHeight);}/** * Set animation style *  * @param screenWidth screen width * @param requestedX distance from left edge * @param onTop flag to indicate where the popup should be displayed. Set TRUE if displayed on top of anchor view *   and vice versa */private void setAnimationStyle(int screenWidth, int requestedX, boolean onTop) {int arrowPos = requestedX - mArrowUp.getMeasuredWidth()/2;switch (mAnimStyle) {case ANIM_GROW_FROM_LEFT:mWindow.setAnimationStyle((onTop) ? R.style.Animations_PopUpMenu_Left : R.style.Animations_PopDownMenu_Left);break;case ANIM_GROW_FROM_RIGHT:mWindow.setAnimationStyle((onTop) ? R.style.Animations_PopUpMenu_Right : R.style.Animations_PopDownMenu_Right);break;case ANIM_GROW_FROM_CENTER:mWindow.setAnimationStyle((onTop) ? R.style.Animations_PopUpMenu_Center : R.style.Animations_PopDownMenu_Center);break;case ANIM_REFLECT:mWindow.setAnimationStyle((onTop) ? R.style.Animations_PopUpMenu_Reflect : R.style.Animations_PopDownMenu_Reflect);break;case ANIM_AUTO:if (arrowPos <= screenWidth/4) {mWindow.setAnimationStyle((onTop) ? R.style.Animations_PopUpMenu_Left : R.style.Animations_PopDownMenu_Left);} else if (arrowPos > screenWidth/4 && arrowPos < 3 * (screenWidth/4)) {mWindow.setAnimationStyle((onTop) ? R.style.Animations_PopUpMenu_Center : R.style.Animations_PopDownMenu_Center);} else {mWindow.setAnimationStyle((onTop) ? R.style.Animations_PopUpMenu_Right : R.style.Animations_PopDownMenu_Right);}break;}}/** * Show arrow *  * @param whichArrow arrow type resource id * @param requestedX distance from left screen */private void showArrow(int whichArrow, int requestedX) {        final View showArrow = (whichArrow == R.id.arrow_up) ? mArrowUp : mArrowDown;        final View hideArrow = (whichArrow == R.id.arrow_up) ? mArrowDown : mArrowUp;        final int arrowWidth = mArrowUp.getMeasuredWidth();        showArrow.setVisibility(View.VISIBLE);                ViewGroup.MarginLayoutParams param = (ViewGroup.MarginLayoutParams)showArrow.getLayoutParams();               param.leftMargin = requestedX - arrowWidth / 2;                hideArrow.setVisibility(View.INVISIBLE);    }/** * Set listener for window dismissed. This listener will only be fired if the quicakction dialog is dismissed * by clicking outside the dialog or clicking on sticky item. */public void setOnDismissListener(QuickAction.OnDismissListener listener) {setOnDismissListener(this);mDismissListener = listener;}@Overridepublic void onDismiss() {if (!mDidAction && mDismissListener != null) {mDismissListener.onDismiss();}}/** * Listener for item click * */public interface OnActionItemClickListener {public abstract void onItemClick(QuickAction source, int pos, int actionId);}/** * Listener for window dismiss *  */public interface OnDismissListener {public abstract void onDismiss();}}
其实源码也很简单,多看看就懂了。那看看怎么设置 以及调用。

2、MainActivity

package com.main.listviewsideslip;import java.util.Collections;import java.util.LinkedList;import com.listview.adapter.RecentAdapter;import com.main.entity.RecentItem;import com.view.listview.BaseSwipeListViewListener;import com.view.listview.SwipeListView;import com.view.pop.ActionItem;import com.view.pop.QuickAction;import android.os.Bundle;import android.view.View;import android.widget.TextView;import android.app.Activity;import android.content.Intent;/** * http://blog.csdn.net/qq_16064871 * @author Administrator */public class MainActivity extends Activity{//listview的适配器private RecentAdapter mAdapter;//listview数据源public  LinkedList mRecentDatas;//自定义的listviewprivate SwipeListView mRecentListView;private TextView mEmpty;private int mClickItem = -1;// 点击item弹出protected QuickAction mItemClickQuickAction = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView(savedInstanceState);initPop();}//单击listview某一项时,可以弹出pop。QuickAction实现类是继承PopupWindowsprivate void initPop() {// 设置ActionmItemClickQuickAction = new QuickAction(this, QuickAction.VERTICAL);ActionItem pointItem = new ActionItem(1, "详细信息", null);ActionItem areaItem = new ActionItem(2, "信息2", null);pointItem.setIcon(null);areaItem.setIcon(null);mItemClickQuickAction.addActionItem(pointItem);mItemClickQuickAction.addActionItem(areaItem);mItemClickQuickAction.setOnActionItemClickListener(new QuickAction.OnActionItemClickListener() {@Overridepublic void onItemClick(QuickAction source, int pos, int actionId) {if (pos == 0) {Intent intent = new Intent(source.GetActionItemsGroup().getContext(),ListViewItemShowActivity.class);RecentItem item = new RecentItem();item = mRecentDatas.get(mClickItem);Bundle bundle = new Bundle();bundle.putInt("HeadImg", item.getHeadImg());bundle.putInt("NewNum", item.getNewNum());bundle.putString("Name", item.getName());intent.putExtras(bundle);startActivity(intent);}//弹出框消失mItemClickQuickAction.dismiss();}});}private void initView(Bundle savedInstanceState) {mRecentListView = (SwipeListView) findViewById(R.id.recent_listview);mRecentDatas = getRecentList();mAdapter = new RecentAdapter(this, mRecentDatas, mRecentListView);mRecentListView.setAdapter(mAdapter);mEmpty = (TextView) findViewById(R.id.empty);mRecentListView.setEmptyView(mEmpty);mRecentListView.setSwipeListViewListener(new BaseSwipeListViewListener() {@Overridepublic void onClickFrontView(View view, int position) {mClickItem = position;//触发弹出mItemClickQuickAction.show(view);}@Overridepublic void onClickBackView(int position) {mRecentListView.closeOpenedItems();// 关闭打开的项}@Overridepublic void onDismiss(int[] reverseSortedPositions) {for (int position : reverseSortedPositions) {mAdapter.remove(position);}}});}//静态数据源的获取public LinkedList getRecentList() {LinkedList list = new LinkedList();nameArray = getResources().getStringArray(R.array.jazzy_effects_ch);for (int i = 0; i < 20; i++) {int icon = heads[i];String name = nameArray[i];int num = numArray[i];RecentItem item = new RecentItem(name, icon, num);list.add(item);}Collections.sort(list);// 降序return list;}public static  int[] heads = { R.drawable.h0, R.drawable.h1,R.drawable.h2, R.drawable.h3, R.drawable.h4, R.drawable.h5,R.drawable.h6, R.drawable.h7, R.drawable.h8, R.drawable.h9,R.drawable.h10, R.drawable.h11, R.drawable.h12, R.drawable.h13,R.drawable.h14, R.drawable.h15, R.drawable.h16, R.drawable.h17,R.drawable.h18, R.drawable.h19, R.drawable.h20, R.drawable.h21};public static  int[] numArray = { 21,67,65,8,54,67,23,78,98,54,67,23,67,423,23,67,90,12,34,56,978};public static String[] nameArray = new String[21];}
也就这样吧,有不清楚欢迎进行评论,个人感觉加上一点注释,都看得懂。个人写博客喜欢话不多说,直接看代码,上源码。

附上与本文相关部分内容,因为我是在此基础上写的Android 使用NineOldAndroids实现仿微信listview左滑出现删除itembutton。

本文的项目源码地址:点击

更多相关文章

  1. Android 4.0 Launcher2源码分析——主布局文件
  2. 源码茶舍之android:externalService是什么属性?实现原理?
  3. Android的消息处理机制(深入源码)
  4. Android内核源码阅读---ashmem.c
  5. 基于 Android NDK 的学习之旅----- C调用Java(附源码)
  6. 【Android 电量优化】JobScheduler 源码分析 ( JobServiceContex
  7. Android事件分发机制完全解析,带你从源码的角度彻底理解(上)

随机推荐

  1. android 自定义加减按钮
  2. android 动态壁纸 2
  3. spring android 编译环境搭建
  4. android 动画
  5. android studio生成apk直接改名字
  6. Eclipse Indigo - Cannot install Androi
  7. android 添加 iconv 支持
  8. android中Textview如何限制在一行显示且
  9. Android强制让某个控件获得焦点
  10. android Material