带列表的自定义PopupWindow

先上效果图:

带列表的自定义PopupWindow_第1张图片

简单的讲解一下,其实思想就是要有个Listview,popupwindow包着这个列表,此处是封装了一个popupwindow,把需要的数据通过构造函数传入即可,需要的数据有列表的list内容,当前选中的项,监听,需要依附在那个View下显示该popupwindow,具体代码如下:

/**
 * Created by lan.zheng on 2016/9/9.
 */
public class RankingPopupWindow extends PopupWindow{
    private ListPopupWindowAdapter mListPopupWindowAdapter;
    private Listener mListener;

    public RankingPopupWindow(final Activity context, List list, String selectName,Listener listener,View view) {
        super(context);
        mListener = listener;
        //拿到基本的item高度,这里给定每个Item的高度和宽度
        DisplayMetrics metric = new DisplayMetrics();
        context.getWindowManager().getDefaultDisplay().getMetrics(metric);
        float density = metric.density;  // 屏幕密度(0.75 / 1.0 / 1.5)
        int densityDpi = metric.densityDpi;  // 屏幕密度DPI(120 / 160 / 240)
        float titleItemHeight = density*50;  //50dp,高
        float paddingWight = density*12;  //12dp
        WindowManager wm = context.getWindowManager();
        int width = wm.getDefaultDisplay().getWidth(); 
        //拿到要显示的总高度,超过5个条目时只显示5个,其余滑动显示
        int height;
        if(list.size() > 5){
            height = (int)titleItemHeight * 5;
        }else {
            height = (int)titleItemHeight * list.size();
        }

        this.setWidth(LinearLayout.LayoutParams.WRAP_CONTENT);
        this.setHeight(LinearLayout.LayoutParams.WRAP_CONTENT);
        View contentView = LayoutInflater.from(context).inflate(R.layout.popup_window_ranking_classify, null);
        this.setContentView(contentView);
        ListView listView = (ListView) contentView.findViewById(R.id.lv_ranking_classify);
        LinearLayout.LayoutParams lp;
        lp= (LinearLayout.LayoutParams) listView.getLayoutParams();
        lp.height = height;
        lp.width = width/2-(int)paddingWight;  //两边有点点空隙
        //设置整个ListView的给定宽高
        listView.setLayoutParams(lp);
        //初始化list适配器,并把数据设置入listView中
        if(mListPopupWindowAdapter != null ){
            mListPopupWindowAdapter = null;
        }
        mListPopupWindowAdapter = new ListPopupWindowAdapter(context,list,selectName,titleItemHeight);
        listView.setAdapter(mListPopupWindowAdapter);

        this.setFocusable(true);
        this.setAnimationStyle(R.style.AnimList);
        ColorDrawable dw = new ColorDrawable(context.getResources().getColor(R.color.transparent));
        this.setBackgroundDrawable(dw);
        this.showAsDropDown(view);

        //点击Item
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView parent, View view, int position, long id) {
                dismiss();
                mListener.onItemClickListener(position);
            }
        });
        //点击返回键
        listView.setOnKeyListener(new View.OnKeyListener(){
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                // TODO Auto-generated method stub
                dismiss();
                return true;
            }
        });

        //消失监听
        this.setOnDismissListener(new OnDismissListener() {
            @Override
            public void onDismiss() {
                mListener.onPopupWindowDismissListener();
            }
        });

        //点击外围
        this.getContentView().setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                setFocusable(false);
                dismiss();
                return true;
            }
        });
    }

    public interface Listener{
        void onPopupWindowDismissListener();  //弹框消失监听
        void onItemClickListener(int position);  //条目点击监听
    }

}

接下来是该popupwindow的布局文件,这里用了一张带阴影的背景图,要想显示该外围,我们还需要把listView弄一点margin值



    
    


然后是ListView的Adapter,这里xml就不写了,就是一个简单的TextView用于显示listItem

/**
 * Created by lan.zheng on 2016/8/30.
 */
public class ListPopupWindowAdapter extends BaseAdapter {
    private List mStringList = new ArrayList<>();
    private Context mContext;
    private String nowSeleteName;
    private int itemHeight;

    public ListPopupWindowAdapter(Context context,List list,String selectName,float height){
        mContext = context;
        mStringList = list;
        nowSeleteName = selectName;
        itemHeight = (int)height;
    }

    @Override
    public int getCount() {
        return mStringList.size();
    }

    @Override
    public Object getItem(int i) {
        return mStringList.get(i);
    }

    @Override
    public long getItemId(int i) {
        return i;
    }

    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {
        ViewHolder lViewHolder = null;  //一开始为null
        if(view  == null){
            lViewHolder = new ViewHolder();
            view = View.inflate(mContext, R.layout.list_item_rank_title_content,null);
            lViewHolder.itemTextView = (TextView) view.findViewById(R.id.tv_ranking_title_item);
            view.setTag(lViewHolder);
        }else {
            lViewHolder = (ViewHolder) view.getTag();
        }
        //文字内容设置
        lViewHolder.itemTextView.setText(mStringList.get(i));
        LinearLayout.LayoutParams lp;
        lp= (LinearLayout.LayoutParams) lViewHolder.itemTextView.getLayoutParams();
        lp.height=itemHeight;
        lViewHolder.itemTextView.setLayoutParams(lp);

        if(mStringList.get(i).equals(nowSeleteName)){  //判断选中项
            lViewHolder.itemTextView.setTextColor(mContext.getResources().getColor(R.color.tab_select_text_color));
            lViewHolder.itemTextView.setBackgroundDrawable(mContext.getResources().getDrawable(R.drawable.drop_down_list_item_selected));
        }else {
            lViewHolder.itemTextView.setBackgroundDrawable(mContext.getResources().getDrawable(R.drawable.drop_down_list_item_normal));
            lViewHolder.itemTextView.setTextColor(mContext.getResources().getColor(R.color.text_666666));
        }
        return view;
    }

    private class ViewHolder {
        TextView itemTextView;

    }           }


最后还要说的是显示弹框的效果的,可以看到
R.style.AnimList

看看怎么实现从上往下的弹出效果,先写弹出和收起的效果

list_pop_show_anim


    

    


list_pop_hidden_anim


    
    
最后就是在styles.xml中写入效果:


最后就是在Activity中使用,来看看怎么使用:

RankingPopupWindow mWindow;
    private void initListItem(final List list, final int flag, final String selectName){
        //生成Listener和清空
        setPopupWindowListener();
        mWindow = null;
        //显示popupwindow
        if(flag == LEFT){
            mWindow = new RankingPopupWindow(this,list,selectName,listener,mLeftWeightLayout);
        }else if(flag == RIGHT){
            mWindow = new RankingPopupWindow(this,list,selectName,listener,mRightWeightLayout);
        }
    }

 RankingPopupWindow.Listener listener;
    private void setPopupWindowListener(){
        listener = null;
        listener = new RankingPopupWindow.Listener() {
            @Override
            public void onPopupWindowDismissListener() {
               //消失时的操作
            }

            @Override
            public void onItemClickListener(int position) {
           //点击Item时的操作
       }
}

使用的时候非常方便,只需要new 一个PopupWindow和一个该弹框的listener回调即可。



你可能感兴趣的:(Android)