Android自定义组件ListPopWindow

先看一下效果:

效果就是这样,看一下实现,其实也没多难,就是想开源出来供小伙伴们使用,如有不合理地方,希望大家多多指正。
1.自定义PopWindow
首先我们分析一下,这样的效果肯定是一个PopWindow嵌套着listview,而上面的title、和下面的cancel是两个文本框,实现起来也比较简单。
然后我们在PopWindow中声明两个接口,用来回调cancel和item的点击事件

public interface OnPopItemClickListener{ void onPopItemClick(View view,int position); } public interface OnBottomTextviewClickListener{ void onBottomClick(); }

然后再设置一些PopWindow的一些属性

parentView = LayoutInflater.from(context).inflate(R.layout.list_popwindow,null); setContentView(parentView); lv = (ListView) parentView.findViewById(R.id.lv_popwindow); //设置弹出窗体的高 this.setWidth(ViewGroup.LayoutParams.MATCH_PARENT); this.setHeight(ViewGroup.LayoutParams.MATCH_PARENT); //设置弹出窗体可点击 this.setFocusable(true); //实例化一个ColorDrawable颜色为半透明 ColorDrawable dw = new ColorDrawable(0xb0000000); //设置SelectPicPopupWindow弹出窗体的背景 this.setBackgroundDrawable(dw);

看一下整体的代码吧:

public class ListPopWindow extends PopupWindow{ private Context context; //上下文 private View parentView; //父视图 private List<PopBean> dataList; //item数据源 private OnPopItemClickListener listener; //item点击接口 private ListView lv; //item列表视图 private View viewTop; //title视图 private String topText,bottomText; //title文字,bottom文字 private TextView tvTop,tvBottom; //title文本,bottom文本 private PopWindowAdapter adapter; //适配器 private OnBottomTextviewClickListener bottomListener;//底部点击接口 public interface OnPopItemClickListener{ void onPopItemClick(View view,int position); } public interface OnBottomTextviewClickListener{ void onBottomClick(); } public ListPopWindow(Context context,OnPopItemClickListener listener,OnBottomTextviewClickListener bottomListener, View parentView,List<PopBean> dataList,String bottomText,String topText){ this.context = context; this.listener = listener; this.parentView = parentView; this.dataList = dataList; this.bottomListener = bottomListener; this.topText = topText; this.bottomText = bottomText; initViews(); } private void initViews(){ parentView = LayoutInflater.from(context).inflate(R.layout.list_popwindow,null); setContentView(parentView); lv = (ListView) parentView.findViewById(R.id.lv_popwindow); //设置弹出窗体的高 this.setWidth(ViewGroup.LayoutParams.MATCH_PARENT); this.setHeight(ViewGroup.LayoutParams.MATCH_PARENT); //设置弹出窗体可点击 this.setFocusable(true); //实例化一个ColorDrawable颜色为半透明 ColorDrawable dw = new ColorDrawable(0xb0000000); //设置SelectPicPopupWindow弹出窗体的背景 this.setBackgroundDrawable(dw); //view添加OnTouchListener监听判断获取触屏位置如果在布局外面则销毁弹出框 parentView.setOnTouchListener(new View.OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { int height = parentView.findViewById(R.id.ll_bottom).getTop(); int y = (int) event.getY(); if (event.getAction() == MotionEvent.ACTION_UP) { if (y > height) { dismiss(); } } return true; } }); update(); viewTop = parentView.findViewById(R.id.view_line1); tvBottom = (TextView) parentView.findViewById(R.id.tv_popwindow_bottom); tvTop = (TextView) parentView.findViewById(R.id.tv_popwindow_first); adapter = new PopWindowAdapter(context,dataList,false); lv.setAdapter(adapter); if (!TextUtils.isEmpty(topText)){ tvTop.setVisibility(View.VISIBLE); tvTop.setText(topText); viewTop.setVisibility(View.VISIBLE); } else { tvTop.setVisibility(View.GONE); viewTop.setVisibility(View.GONE); } if (!TextUtils.isEmpty(bottomText)){ tvBottom.setVisibility(View.VISIBLE); tvBottom.setText(bottomText); } else { tvBottom.setVisibility(View.GONE); } lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { listener.onPopItemClick(view, i); } }); tvBottom.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { bottomListener.onBottomClick(); } }); } }

2.看一些item的bean

这里我就声明了title和图片的id

package com.hankkin.library; public class PopBean { private String title; private int icon_res; public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public int getIcon_res() { return icon_res; } public void setIcon_res(int icon_res) { this.icon_res = icon_res; } public PopBean(String title, int icon_res) { this.title = title; this.icon_res = icon_res; } }

3.自定义adapter适配器

这里面可能要注意的就是item的背景设置,有的是上半部分圆角、有的是下半部分圆角,特殊处理一下

@Override public View getView(int i, View view, ViewGroup viewGroup) { ViewHolder holder; if (view == null) { view = inflater.inflate(R.layout.listview_popwindow_item, null); holder = new ViewHolder(); holder.tv_name = (TextView) view.findViewById(R.id.tv_title); holder.v_line = (View) view.findViewById(R.id.v_line); view.setTag(holder); } else { holder = (ViewHolder) view.getTag(); } holder.tv_name.setText(dataList.get(i).getTitle()); if (dataList.size() - 1 == i) { holder.v_line.setVisibility(View.INVISIBLE); holder.tv_name.setBackground(context.getResources().getDrawable(R.drawable.selector_bottom_half)); } else { holder.v_line.setVisibility(View.VISIBLE); holder.tv_name.setBackground(context.getResources().getDrawable(R.drawable.list_gray_item)); } return view; }

最后看一下调用

Activity需要实现item接口(OnPopItemClickListener)和底部按钮接口(OnBottomTextviewClickListener)

public void show(View view){ List<PopBean> pops = new ArrayList<>(); for (int i=0;i<5;i++){ PopBean pop = new PopBean("item"+i,0); pops.add(pop); } popWindow = new ListPopWindow(MainActivity.this,this,this,rl,pops,"cancel","title"); popWindow.showAtLocation(rl, Gravity.CENTER| Gravity.BOTTOM,0,0); }

以上就是本文的全部内容,希望能够对大家的学习有所帮助。

时间: 2024-07-29 18:35:55

Android自定义组件ListPopWindow的相关文章

Android自定义组件ListPopWindow_Android

先看一下效果: 效果就是这样,看一下实现,其实也没多难,就是想开源出来供小伙伴们使用,如有不合理地方,希望大家多多指正. 1.自定义PopWindow 首先我们分析一下,这样的效果肯定是一个PopWindow嵌套着listview,而上面的title.和下面的cancel是两个文本框,实现起来也比较简单. 然后我们在PopWindow中声明两个接口,用来回调cancel和item的点击事件 public interface OnPopItemClickListener{ void onPopIt

android自定义组件实现方法_Android

本文实例讲述了android自定义组件实现方法.分享给大家供大家参考.具体如下: atts.xml: <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="TopBar"> <attr name="titleText" format="string"/> <

Android 自定义组件成JAR包的实现方法_Android

Android 自定义组件成JAR包的实现方法,这里对自己实现的Android View 组件进行JAR 包的处理.             在项目开发过程中,我们难免会用到自己去制作自定义的VIEW控件,之后我们别的项目如果需要的话就直接将其复制到对应的项目中使用,虽说这么做是一个解决问题的方法,但毕竟不是很好. 原因是,当我们项目积累越来越多,会发现自定义的控件越来越多,而且这些自定义的控件都是可以重复利用的,这时我们可以想想,如果把这些自定义控件都封装成一个JAR包,然后用一个项目积累起来

android自定义组件实现方法

本文实例讲述了android自定义组件实现方法.分享给大家供大家参考.具体如下: atts.xml: <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="TopBar"> <attr name="titleText" format="string"/> <

Android自定义组件获取本地图片和相机拍照图片

iOS中有封装好的选择图片后长按出现动画删除效果,效果如下 而Android找了很久都没有找到有这样效果的第三方组件,最后懒得找了还是自己实现这效果吧 选择图片后还可对图片进行剪裁 当然,代码中还有很多不完善的地方,我接下来会继续完善这个组件的 已经上传到开源社区,欢迎大家来Star啊~ Demo源码:传送门 设计中的碰到的一些问题和解决思路 1.如何让加号图片显示在GridView最后面 首先在调用GridAdapter构造方法时就加载加号图片 /** * 图片适配器 * @param con

Android 自定义组件卫星菜单的实现

卫星菜单 ArcMenu 相信大家接触安卓,从新手到入门的过渡,就应该会了解到卫星菜单.抽屉.Xutils.Coolmenu.一些大神封装好的一些组件.这些组件在 Github 上面很容易搜得到,但是有时候打开会发现看不懂里面的代码,包括一些方法和函数 ..... 首先先上效果图: 实现效果 首先如果要想自定义组件 1.那么第一件事就是赋予自定义组件的属性,从效果图上看出,该组件可以存在屏幕的各个角落点,那么位置是其属性之一. 2.既然是卫星菜单,那么主按钮和其附属的小按钮之间的围绕半径也应该作

android自定义组件的简易实现

写这篇博客是为了复习之前在慕课上面有幸看到的自定义组件的实现,原理很简单,有三个步骤, 为自定义的组件做好声明:封装成具体的可以使用的组件类,并利用接口回调机制为其注册监听函数:想使用正常的组件的方式稍加修改后进行使用.是不是感觉思路很清晰啊,那么让我们一起来实现它吧. 1.做好声明,在新建的工程的value文件夹下创建一个名为atts.xml的文件,然后添加进自己将会使用到的"元素",需要注意的是declare-styleable 下的name属性,这个值尤其重要,这个和就是今后我们

Android自定义组件跟随自己手指主动画圆

本文实例为大家分享了Android实现跟随手指画圆的具体代码,供大家参考,具体内容如下 首先自己定义一个View子类: package com.example.androidtest0.myView; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.util.Att

ui-Android自定义组件是如何定义宽度和高度的?

问题描述 Android自定义组件是如何定义宽度和高度的? android:id="@+id/playerSeekBar" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_marginLeft="70dp" android:layout_marginRight="70dp" andro