PopupWindow + RecyclerView的使用
来源:互联网 发布:单片机如何控制电机 编辑:程序博客网 时间:2024/05/22 07:03
前段时间的项目中,遇到了一个对于当时的我来说,是一个比较麻烦的事,就是在使用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 0
- PopupWindow + RecyclerView的使用
- PopupWindow的简单使用(结合RecyclerView)
- Android PopupWindow的使用
- Android PopupWindow的使用
- Android PopupWindow的使用!!!
- 关于popupWindow的使用
- PopupWindow的使用
- PopupWindow的使用例子
- PopupWindow的使用
- popupWindow的使用心得
- PopupWindow的使用
- PopupWindow的使用
- Android PopupWindow的使用!!!
- PopupWindow的使用
- PopupWindow的使用
- popupWindow的使用
- PopupWindow的使用
- PopupWindow的使用
- c++ 多线程学习
- MySQL上的一些操作
- Oracle使用split和splitstr函数批量分隔字符串
- 数据库日志文件-- undo log 、redo log、 undo/redo log
- http://www.jeasyui.net
- PopupWindow + RecyclerView的使用
- GNU make 101
- marionette中的View的el id className tagName 属性
- 南大软院大神养成计划——第三天
- CountDownTimer的使用以及解决Cancel无效的问题
- POJ-2406-kmp求最小循环节
- 三种同步FIFO的实现方法(verilog实现)
- 真机调试 与 响应者链
- LightOJ 1011 - Marriage Ceremonies(状压DP)