关闭

PopupWindow + RecyclerView的使用

标签: PopupWindowRecyclerView
3833人阅读 评论(1) 收藏 举报
分类:
前段时间的项目中,遇到了一个对于当时的我来说,是一个比较麻烦的事,就是在使用PopupWindow做顶部的弹出菜单的时候,我用了GridView来添加itemView,结果发现在点击的时候,会出现itemView的父布局也会出现点击现象,没达到项目要求,然后就使用了RecyclerView来做这个功能。下面贴部分代码:
import android.content.Context;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.PopupWindow;
import android.widget.RelativeLayout;

import java.util.List;

/**
 * Created by Virczz on 2015/11/18
 */
public class Fm_ShouYe11 extends Fragment implements View.OnClickListener {
    private View view;

    private String totalUrl = "http://www.test.com";
    private Gson gson = new GsonBuilder().create();
    private PopupWindow popupWindow;
    private RelativeLayout rl_main_titlebar;

    /* 点击PopupWindow后的数据传递 */
    private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {

            switch (msg.what) {
                case 0x11:

                    /* 对UI线程的操作 */

                    break;
            }
        }
    };

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.shouye_fm, null);

         /* 布局代码  */
        initView();

        return view;
    }

    @Override
    /** PopupWindow的点击 */
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.iv_main_menu:
                /* 主页左上角的菜单 */
                if (popupWindow != null && popupWindow.isShowing()) {

                    return;
                } else {
                    /* 第一次打开PopupWindow */
                    showPop();
                }
                break;
            default:
                break;
        }
    }

    /**
     * 初始化视图
     */
    private void initView() {
        ImageView iv_main_menu;

        rl_main_titlebar = (RelativeLayout) view.findViewById(R.id.rl_main_titlebar);
        iv_main_menu = (ImageView) view.findViewById(R.id.iv_main_menu);

        rl_main_titlebar.setOnClickListener(this);
        iv_main_menu.setOnClickListener(this);
    }

    /**
     * 展示CategoryPopupWindow
     */
    private void showPop() {
        CategoryPopupWindow catePop = null;

        catePop = new CategoryPopupWindow(getActivity());

    }

    /**
     * CategoryPopupWindow  封装了PopupWindow的类
     */
    public class CategoryPopupWindow {
        final String cagetoryUrl = "http://www.test.com";
        private Context context;
        
        private CategoriesRvAdapter rvAdapter;
        private RecyclerView popupWindowRecycler;

        /* 获取自定义布局文件categories_view的视图*/
        private LayoutInflater mLayoutInflater;
        private ViewGroup customView;

        private StringBuffer sb = new StringBuffer();

        private CategoryPopupWindow(Context context) {
            this.context = context;
            FirstOpenCategory();

        }

        /**
         * 打开PopupWindow   加载数据和界面
         */
        private void FirstOpenCategory() {
            mLayoutInflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            customView = (ViewGroup) mLayoutInflater.inflate(R.layout.categories_view, null, false);

            /* 初始化视图 */
            popupWindowRecycler = (RecyclerView) customView.findViewById(R.id.recycler_categories);

            /* 这句话可能导致popupWindowRecycler不能展示并报错:RecyclerView: No adapter attached; skipping layout */
            popupWindowRecycler.requestFocus();

            popupWindowRecycler.setHasFixedSize(true);

            GridLayoutManager cateGridLayoutManager = new GridLayoutManager(context, 3);
            popupWindowRecycler.setLayoutManager(cateGridLayoutManager);
            popupWindowRecycler.setItemAnimator(new DefaultItemAnimator());
            popupWindowRecycler.setFocusable(true);

            /* 网络请求区域 */
            rvAdapter = new CategoriesRvAdapter("你的List");
            popupWindowRecycler.setAdapter(rvAdapter);

            popupWindowRecycler.setClickable(true);
            rvAdapter.setOnItemClickListener(new CategoriesRvAdapter.CustomOnItemClickListener() {
                @Override
                public void onItemClick(View v, int position) {
                    sb.append("http://www.test.com");

                    Message message = mHandler.obtainMessage();
                    message.obj = sb.toString();
                    message.what = 0x11;
                    mHandler.sendMessage(message);

                    popupWindow.dismiss();
                }
            });
            

            /* 创建PopupWindow实例 */
            popupWindow = new PopupWindow(customView, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, true);

            /* 设置PopupWindow背景 */
            popupWindow.setBackgroundDrawable(new ColorDrawable(getResources().getColor(R.color.colorWhite)));

            /* 设置动画效果 [R.style.AnimationFade] */
            //popupWindow.setAnimationStyle(R.style.AnimationFade);

            popupWindow.update();
            popupWindow.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED);
            popupWindow.setTouchable(true);
            popupWindow.setOutsideTouchable(true);
            popupWindow.setFocusable(true);

            /* 设置popupWindow的位置(相对rl_main_titlebar的位置) */
            int topBarHeight = rl_main_titlebar.getBottom();
            popupWindow.showAsDropDown(rl_main_titlebar, 0, (topBarHeight - rl_main_titlebar.getHeight()) / 2);

            /* 自定义view 添加触摸事件 */
            customView.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    int height = customView.findViewById(R.id.recycler_categories).getTop();
                    int y = (int) event.getY();
                    if (event.getAction() == MotionEvent.ACTION_UP) {
                        if (y < height) {
//                            popupWindow.dismiss();//这里是点击空白处消失的方法
                        }
                    }
                    return true;
                }
            });
        }
    }
}


上面在CategiriesRvAdapter里为RecyclerView重写了监听接口。

在适配器里要设置item的参数列表

public class CategoriesRvAdapter extends RecyclerView.Adapter<CategoriesRvAdapter.ViewHolder> {

...
ViewGroup.LayoutParams layoutParams = holder.textView.getLayoutParams();
layoutParams.height = (int) (Math.random() * 100);
layoutParams.height = holder.textView.getMaxHeight();
layoutParams.width = holder.textView.getMaxWidth();
holder.textView.setLayoutParams(layoutParams);
...
}

大致就是这样了,用Handler来传递需要传递的数据,就可以操作UI线程了。





0
1
查看评论

recyclerview点击item弹出popupwindow

recyclerview+popupwindow: 先看activity: package com.fanyafeng.orlitedemo.recycleview.activity; import android.os.Bundle; import android.support.desig...
  • qq_23195583
  • qq_23195583
  • 2016-04-26 17:48
  • 2954

PopupWindow的简单使用(结合RecyclerView)

Android弹窗: 在Android中弹出式菜单(以下称弹窗)是使用十分广泛一种菜单呈现的方式,弹窗为用户交互提供了便利。关于弹窗的实现大致有以下两种方式AlertDialog和PopupWindow;两者的区别:AlertDialog弹窗在位置显示上是固定的,而PopupWindow则相对比较随...
  • shu_lance
  • shu_lance
  • 2017-07-28 16:04
  • 1075

RecyclerView+PopupWindow 自定义弹框

好久没写博客了,从7月份一直实习到现在,趁着过年有时间,整理一下今年学到的东西,弹框是我们一直需要的控件之一,所以弄一个好的弹框显示是蛮有必要的,这是我在我的项目里自己封装的一个弹框控件。 我们采用RecyclerView + PopupWindow要封装我们的弹框控件的样式,Recycle...
  • TIANLANG3
  • TIANLANG3
  • 2016-02-05 22:53
  • 3819

(优化版)基于PopupWindow和RecycleView仿美团二级列表Demo

  • 2017-03-14 17:33
  • 26.46MB
  • 下载

Android RecyclerView实现下拉列表功能

现在市面上的很多的应用,都带有下拉列表的功能,将所有选项都放在下拉列表中,交互更好。很多下拉列表都是用ListView + PopupWindow来实现的,由于Google推出了替代ListView的RecyclerView,所以简单实现一下: MainActivity.java package c...
  • shineflowers
  • shineflowers
  • 2015-12-21 14:11
  • 2175

加载本地Xml文件实现省市区三级联动PopupWindows+ RecyclerView

项目需求要实现省市二级联动,因为一直没有定样式,所以一直没有开动,但是ios小伙伴先给搞定了,没办法就照着他的样式来写一个吧, 首先看下效果吧,没有加以美化选中效果.... 主要是用PopupWindows来实现了省市的二级联动,xml文件很齐全,就捎带把区也写了进去..但是没有实现,有兴趣的...
  • hui9520
  • hui9520
  • 2017-01-12 17:04
  • 561

RecyclerView 项目集合

RecyclerView 项目集合 享受技术带来的快乐 不管前方的路有多远和多苦,只要走的方向是正确的,不管多么崎岖不平,都比站在原地更接近幸福! ...
  • anroidyanyou
  • anroidyanyou
  • 2016-08-29 20:39
  • 764

RecyclerView嵌入CheckBox带来的显示问题的解决办法

  • 2016-11-11 22:18
  • 33.73MB
  • 下载

当popupWindow内嵌套recyclerView布局过长的时候会被顶上去的问题

最近在写一个自定义的popupWindow的时候,里面嵌套recyclerView布局,recyclerView内是个自定义的布局,但是当数据过多的时候popupwindow设置在某个控件下方的时候就不准确了,会被顶上去,这样就达不到效果了,解决方法如下首先你需要自定义一个popupWindow,重...
  • fzkf9225
  • fzkf9225
  • 2017-11-08 10:53
  • 158

通用PopupWindow,几行代码搞定PopupWindow弹窗

我们都知道,Android 中的弹窗基本有两种,一种是AlertDialog,另一种是PopupWindow,AlertDialog的显示位置是固定的,PopWindow 的显示位置是我们可以设置和调整的,因此,像项目中的一些场景如:某个功能的提示说明、点击按钮在按钮上方或者下方弹出菜单、新功能弹窗...
  • xinxin__
  • xinxin__
  • 2017-12-22 08:23
  • 71
    个人资料
    • 访问:11560次
    • 积分:199
    • 等级:
    • 排名:千里之外
    • 原创:8篇
    • 转载:0篇
    • 译文:0篇
    • 评论:2条
    最新评论