Android实现简单下拉筛选框

最近接到一个新的项目,项目时间比较紧张,有一个功能类似于58同城,京东的一个下拉筛选框,为了节省时间,从网上面拷贝了一份封装好的代码,进行的自己的一些修改,感觉灵活性还挺高的,分享出来给大家看一看

大致效果如下,可以自己加入自己的布局

先看一下这个ExpandTabView这个类  代码比较简单 我就不做具体介绍了 有不懂的可以私信我

public class ExpandTabView extends LinearLayout implements OnDismissListener {

 private ToggleButton selectedButton;
 private ArrayList<String> mTextArray = new ArrayList<String>();
 private ArrayList<RelativeLayout> mViewArray = new ArrayList<RelativeLayout>();
 private ArrayList<ToggleButton> mToggleButton = new ArrayList<ToggleButton>();
 private Context mContext;
 private final int SMALL = 0;
 private int displayWidth;
 private int displayHeight;
 private PopupWindow popupWindow;
 private int selectPosition;

 public ExpandTabView(Context context) {
 super(context);
 init(context);
 }

 public ExpandTabView(Context context, AttributeSet attrs) {
 super(context, attrs);
 init(context);
 }

 /**
 * 根据选择的位置设置tabitem显示的值
 */
 public void setTitle(String valueText, int position) {
 if (position < mToggleButton.size()) {
 mToggleButton.get(position).setText(valueText);
 }
 }

 public void setTitle(String title){

 }
 /**
 * 根据选择的位置获取tabitem显示的值
 */
 public String getTitle(int position) {
 if (position < mToggleButton.size() && mToggleButton.get(position).getText() != null) {
 return mToggleButton.get(position).getText().toString();
 }
 return "";
 }

 /**
 * 设置tabitem的个数和初始值
 */
 public void setValue(ArrayList<String> textArray, ArrayList<View> viewArray) {
 if (mContext == null) {
 return;
 }
 LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

 mTextArray = textArray;
 for (int i = 0; i < viewArray.size(); i++) {
 final RelativeLayout r = new RelativeLayout(mContext);
 int maxHeight = (int) (displayHeight * 0.7);
 RelativeLayout.LayoutParams rl = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.FILL_PARENT, maxHeight);
 rl.leftMargin = 10;
 rl.rightMargin = 10;
 r.addView(viewArray.get(i), rl);
 mViewArray.add(r);
 r.setTag(SMALL);
 ToggleButton tButton = (ToggleButton) inflater.inflate(R.layout.toggle_button, this, false);
 addView(tButton);
 View line = new TextView(mContext);
 line.setBackgroundResource(R.drawable.choosebar_line);
 if (i < viewArray.size() - 1) {
 LayoutParams lp = new LayoutParams(2, LayoutParams.FILL_PARENT);
 addView(line, lp);
 }
 mToggleButton.add(tButton);
 tButton.setTag(i);
 tButton.setText(mTextArray.get(i));

 r.setOnClickListener(new OnClickListener() {
 @Override
 public void onClick(View v) {
  onPressBack();
 }
 });

 r.setBackgroundColor(mContext.getResources().getColor(R.color.popup_main_background));
 tButton.setOnClickListener(new OnClickListener() {
 @Override
 public void onClick(View view) {
  // initPopupWindow();
  ToggleButton tButton = (ToggleButton) view;

  if (selectedButton != null && selectedButton != tButton) {
  selectedButton.setChecked(false);
  }
  selectedButton = tButton;
  selectPosition = (Integer) selectedButton.getTag();
  startAnimation();
  if (mOnButtonClickListener != null && tButton.isChecked()) {
  mOnButtonClickListener.onClick(selectPosition);
  }
 }
 });
 }
 }

 private void startAnimation() {

 if (popupWindow == null) {
 popupWindow = new PopupWindow(mViewArray.get(selectPosition), displayWidth, displayHeight);
 popupWindow.setAnimationStyle(R.style.PopupWindowAnimation);

 popupWindow.setFocusable(false);
 popupWindow.setOutsideTouchable(true);
 }

 if (selectedButton.isChecked()) {
 if (!popupWindow.isShowing()) {
 showPopup(selectPosition);
 } else {
 popupWindow.setOnDismissListener(this);
 popupWindow.dismiss();
 hideView();
 }
 } else {
 if (popupWindow.isShowing()) {
 popupWindow.dismiss();
 hideView();
 }
 }
 }

 private void showPopup(int position) {
 View tView = mViewArray.get(selectPosition).getChildAt(0);
 if (tView instanceof ViewBaseAction) {
 ViewBaseAction f = (ViewBaseAction) tView;
 f.show();
 }
 if (popupWindow.getContentView() != mViewArray.get(position)) {
 popupWindow.setContentView(mViewArray.get(position));
 }
 popupWindow.showAsDropDown(this, 0, 0);
 }

 /**
 * 如果菜单成展开状态,则让菜单收回去
 */
 public boolean onPressBack() {
 if (popupWindow != null && popupWindow.isShowing()) {
 popupWindow.dismiss();
 hideView();
 if (selectedButton != null) {
 selectedButton.setChecked(false);
 }
 return true;
 } else {
 return false;
 }

 }

 private void hideView() {
 View tView = mViewArray.get(selectPosition).getChildAt(0);
 if (tView instanceof ViewBaseAction) {
 ViewBaseAction f = (ViewBaseAction) tView;
 f.hide();
 }
 }

 private void init(Context context) {
 mContext = context;
 displayWidth = ((Activity) mContext).getWindowManager().getDefaultDisplay().getWidth();
 displayHeight = ((Activity) mContext).getWindowManager().getDefaultDisplay().getHeight();
 setOrientation(LinearLayout.HORIZONTAL);
 }

 @Override
 public void onDismiss() {
 showPopup(selectPosition);
 popupWindow.setOnDismissListener(null);
 }

 private OnButtonClickListener mOnButtonClickListener;

 /**
 * 设置tabitem的点击监听事件
 */
 public void setOnButtonClickListener(OnButtonClickListener l) {
 mOnButtonClickListener = l;
 }

 /**
 * 自定义tabitem点击回调接口
 */
 public interface OnButtonClickListener {
 public void onClick(int selectPosition);
 }

}

这个代码基本就是对popupwindow进行了封装,通过对ToggleButton按钮的监听来实现popupwindow的弹出和收回。

外部设置的话,也特别简单,只需要将自己定义好的布局传入到list集合中就可以。

下面是MainActivity中的代码

public class MainActivity extends AppCompatActivity {

 private ExpandTabView expandTabView;
 private ArrayList<View> mViewArray = new ArrayList<View>();
 private ViewLeft viewLeft;
 private ViewMiddle viewMiddle;
 private ViewRight viewRight;

 @Override
 protected void onCreate(Bundle savedInstanceState) {

  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  initView();
  initVaule();
  initListener();

 }

 private void initView() {

  expandTabView = (ExpandTabView) findViewById(R.id.expandtab_view);
  viewLeft = new ViewLeft(this);
  viewMiddle = new ViewMiddle(this);
  viewRight = new ViewRight(this);

 }

 private void initVaule() {
  mViewArray.add(viewMiddle);
 mViewArray.add(viewLeft);
 mViewArray.add(viewRight);
  ArrayList<String> mTextArray = new ArrayList<String>();
  mTextArray.add("区域");
 mTextArray.add("距离");
 mTextArray.add("距离");

  expandTabView.setValue(mTextArray, mViewArray);
// expandTabView.setTitle(viewLeft.getShowText(), 0);
// expandTabView.setTitle(viewMiddle.getShowText(), 1);
// expandTabView.setTitle(viewRight.getShowText(), 2);

 }

 private void initListener() {

  viewLeft.setOnSelectListener(new ViewLeft.OnSelectListener() {

   @Override
   public void getValue(String distance, String showText) {
    onRefresh(viewLeft, showText);
   }
  });

  viewMiddle.setOnSelectListener(new ViewMiddle.OnSelectListener() {

   @Override
   public void getValue(String showText) {

    onRefresh(viewMiddle,showText);

   }
  });

  viewRight.setOnSelectListener(new ViewRight.OnSelectListener() {

   @Override
   public void getValue(String distance, String showText) {
    onRefresh(viewRight, showText);
   }
  });

 }

 private void onRefresh(View view, String showText) {

  expandTabView.onPressBack();
  int position = getPositon(view);
  if (position >= 0 && !expandTabView.getTitle(position).equals(showText)) {
   expandTabView.setTitle(showText, position);
  }
//  Toast.makeText(MainActivity.this, showText, Toast.LENGTH_SHORT).show();

 }

 private int getPositon(View tView) {
  for (int i = 0; i < mViewArray.size(); i++) {
   if (mViewArray.get(i) == tView) {
    return i;
   }
  }
  return -1;
 }

 @Override
 public void onBackPressed() {

  if (!expandTabView.onPressBack()) {
   finish();
  }

 }

}

以上就是这个筛选菜单栏的大致用法,个人感觉还是比较简单的,也比较灵活,修改起来也比较方便。

但是在项目中使用的时候碰到了一个问题,就是popupwindow在7.0的手机上弹出位置异常的问题,,查了一下,是因为手机状态栏高度的问题

于是重写了一下popupwindow的showAsDropDown方法就解决了,下面是具体代码

@Override
 public void showAsDropDown(View anchor, int xoff, int yoff) {
  if(Build.VERSION.SDK_INT >= 24) {
   Rect rect = new Rect();
   anchor.getGlobalVisibleRect(rect);
   int h = anchor.getResources().getDisplayMetrics().heightPixels - rect.bottom;
   setHeight(h);
  }
  super.showAsDropDown(anchor, xoff, yoff);
 }

通过对SDK版本来进行判断,大于24的话就执行这个方法,解决了popupwindow在7.0手机上异常弹出的问题。

最后附上Demo地址

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • android仿京东商品属性筛选功能

    筛选和属性选择是目前非常常用的功能模块:几乎所有的APP中都会使用: 点击筛选按钮会弹出一个自己封装好的popupWindow,实用方法非常简单:两行代码直接显示:(当然初始化数据除外) 这里和以前用到的流式布局有些不一样:流式布局 以前使用的是单个分类,而且也没有在项目中大量实用:这个筛选功能除了数据外几乎都是从项目中Copy出来的: 整个popupWindow布局就是一个自定义的ListView,这个自定义的listview主要是控制listview的高度: 如果数据少的话就是自适应,如果数

  • 可支持快速搜索筛选的Android自定义选择控件

    Android 自定义支持快速搜索筛选的选择控件使用方法,具体如下 项目中遇到选择控件选项过多,需要快速查找匹配的情况. 做了简单的Demo,效果图如下: 源码地址:https://github.com/whieenz/SearchSelect 这个控件是由Dialog+SearchView+ListView实现的.Dialog用来承载选择控件,SearchView实现输入,ListView展示结果.设计概要图如下: 一.自定义Dialog Dialog布局文件 <?xml version=&quo

  • android实现筛选菜单效果

    前言 由于android M的popupwindow与之前版本不一致,笔者找不到能够代码监听物理返回键的方式,故另寻方式实现筛选菜单.5.0及之前的版本可用popupwindow实现,详情请参考popupwindow用法. 本篇采用Dialog实现. 实现步骤 1.设置主题 一般设置如下 <style name="Translucent_NoTitle" parent="android:style/Theme.Dialog"> <item name

  • Android 仿京东侧滑筛选实例代码

    简单介绍 这个demo写的是仿京东的侧滑筛选页面,点击进入筛选后进入二级筛选,两次侧滑的筛选,还包括ListView+CheckBox滑动冲突,ListView+ GridView显示一行问题解决,接口回调传递数据等 效果图 简单得代码介绍 1.首页侧滑用的是安卓官方V4包中的DrawerLayout <?xml version="1.0" encoding="utf-8"?> <android.support.v4.widget.DrawerLa

  • Android实现简单下拉筛选框

    最近接到一个新的项目,项目时间比较紧张,有一个功能类似于58同城,京东的一个下拉筛选框,为了节省时间,从网上面拷贝了一份封装好的代码,进行的自己的一些修改,感觉灵活性还挺高的,分享出来给大家看一看 大致效果如下,可以自己加入自己的布局 先看一下这个ExpandTabView这个类  代码比较简单 我就不做具体介绍了 有不懂的可以私信我 public class ExpandTabView extends LinearLayout implements OnDismissListener { pr

  • Android中Spinner(下拉框)控件的使用详解

    android给我们提供了一个spinner控件,这个控件主要就是一个列表,那么我们就来说说这个控件吧,这个控件在以前的也看见过,但今天还是从新介绍一遍吧. Spinner位于 android.widget包下,每次只显示用户选中的元素,当用户再次点击时,会弹出选择列表供用户选择,而选择列表中的元素同样来自适配器.Spinner是View类得一个子类. 1.效果图 2.创建页面文件(main.xml) <Spinner android:id="@+id/spinner1" and

  • JS简单设置下拉选择框默认值的方法

    本文实例讲述了JS简单设置下拉选择框默认值的方法.分享给大家供大家参考,具体如下: //根据下拉对象默认选中后台对应的记录 function setSelectOption(objSelect, targetValue){ if(objSelect){ var options = objSelect.options; if(options){ var len = options.length; for(var i=0;i<len;i++){ if(options[i].value == targ

  • Android第三方开源下拉框NiceSpinner使用详解

    android原生的下拉框Spinner基本上可以满足Android开发对于下拉选项的设计需求,但现在越来越流行的下拉框不满足于Android原生提供的下拉框Spinner所提供的设计样式,而改用自定制或者第三方设计的下拉框Spinner. NiceSpinner是一个第三方开源的下拉框Spinner,其在github上的项目主页是:https://github.com/arcadefire/nice-spinner  NiceSpinner原设计效果如动图所示: 但是通常开发者对于可能还需要对

  • JS实现的简单下拉框联动功能示例

    本文实例讲述了JS实现的简单下拉框联动功能.分享给大家供大家参考,具体如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head

  • Android实现联动下拉框二级地市联动下拉框功能

    日常使用软件中,为了方便且规范输入,会使用到下拉框进行输入,如注册时生日选项,购物时的地址输入,都会用到下拉框,今日笔者为了巩固已学的知识,实现了二级联动下拉框用作回顾及分享给求知的新手. 思路/步骤: 在实现联动下拉框之前,我们先对用到的ArrayAdapter和数据的封装作必要的了解,Android 中提供了很多适配器的实现类,其中ArrayAdapter就其中之一.它可以通过泛型来指定要适配的数据类型,然后在构造函数中把要适配的数据传入.如: ArrayAdapter<CharSequen

  • Android仿美团下拉菜单(商品选购)实例代码

    美团电商应用平台大家使用非常频繁,下面小编通过本文给大家介绍电商应用平台中常用的选择类别下拉列表的实现.先给大家展示下效果图: 一.下拉列表的实现 其实实现方法有很多,这时实现的也没有什么技术含量,只是总结下自己在项目中的做法,也提供一个思路. 首先是列表的数据,一般数据都是从后台读过来,这里因为没有后台,所以写死在客户端: private void initMenuData() { menuData = new ArrayList<map<string, string=""

  • Android中Listview下拉刷新和上拉加载更多的多种实现方案

    listview经常结合下来刷新和上拉加载更多使用,本文总结了三种常用到的方案分别作出说明. 方案一:添加头布局和脚布局 android系统为listview提供了addfootview和addheadview两个API.这样可以直接自定义一个View,以添加视图的形式实现下来刷新和上拉加载. 实现步骤    1.创建一个类继承ListView:class PullToRefreshListView extends ListView: 2.在构造方法中添加HeadView:addHeaderVi

  • android 有阻尼下拉刷新列表的实现方法

    本文将会介绍有阻尼下拉刷新列表的实现,先来看看效果预览: 这是下拉状态: 这是下拉松开手指后listView回滚到刷新状态时的样子: 1. 如何调用 虽然效果图看起来样子不太好看,主要是因为那个蓝色的背景对不对,没关系,这只是一个背景而已,在了解了我们这个下拉刷新列表的实现之后,你就可以很轻松地修改这个背景,从而实现你想要的UI效果!话不多说,下面我们先来讲讲这个下拉刷新列表是如何使用的,这也是我们编写代码所要实现的目标. final PullToRefreshListView eListVie

  • Flutter实现自定义下拉选择框的示例详解

    在一些列表页面中,我们经常会有上方筛选项的的需求,点击出现一个下拉菜单,多选.单选.列表选等,而在Flutter中,并没有现成的这样的组件,找第三方的扩展有时候又会受到一定限制,所以最好我们可以自己做一个,这样即使扩展我们也会得心应手. 先看效果图: 关键点:弹出.收回动画.状态改变.选项联动 思路: 我们可以看到一个完整的下拉框有头部和具体的下拉选项两部分组成,头部又和下拉组进行了联动, 把头部当做1个数组,下方选项作为1个数组,两个数组数量一致之间形成一个完整的下拉选择框可以更好的控制联动效

随机推荐