android自定义ListView实现底部View自动隐藏和消失的功能

android自定义ListView实现底部View自动隐藏和消失的功能,第1张

概述有这样一个ListView,要求在屏幕底部有一个筛选排序的浮动框:1、手指下拉隐藏,上滑显示;

有这样一个ListVIEw,要求在屏幕底部有一个筛选排序的浮动框:

1、手指下拉隐藏,上滑显示 ;

2、如果没做任何 *** 作,2S之后,要自动显示;

3、滑动到最底部,始终显示。

首先看其效果图:

实现上述效果,其实现原理如下:

 1、在屏幕顶部固定一个BottomVIEw,XML布局最好使用relativeLayout(底部的BottomVIEw并不是 ListVIEw的footVIEw,这个是和footVIEw独立的,想想为什么?)

 2、然后自定义ListVIEw控件,监听ontouchEvent事件,主要是监听手指下滑和上滑事件,同时实现onScrollListener,监听是否滑动到最底部和最顶部

3、 ListVIEw监听事件中,控制bottomVIEw的显示和隐藏,所以ListVIEw提供一个接口,设置底部bootomVIEw的内容,然后获之后,就可以对bottomVIEw进行控制,同时加上动画效果。

接下来看是如何的具体实现这种效果:

1。底部BottomVIEw的内容如下,这个XML文件的内容是自定义的,根据各项目的内容需求来定义的,我例子中bottom_vIEw.xml:

<?xml version="1.0" enCoding="UTF-8"?> <linearLayout xmlns:androID="http://schemas.androID.com/apk/res/androID"   androID:ID="@+ID/button_layout"   androID:layout_wIDth="fill_parent"   androID:layout_height="50dp"   androID:background="#cbcbcb"   androID:gravity="center_vertical"   androID:orIEntation="horizontal" >     <button androID:layout_height="40dp"          androID:layout_wIDth="wrap_content"          androID:layout_weight="1"          androID:text="价格" />     <button androID:layout_height="40dp"        androID:layout_wIDth="wrap_content"        androID:layout_weight="1"        androID:text="好评" />     <button androID:layout_height="40dp"       androID:layout_wIDth="wrap_content"       androID:layout_weight="1"       androID:text="筛选" />   </linearLayout>  

2、main.xml如下

<?xml version="1.0" enCoding="utf-8"?> <relativeLayout xmlns:androID="http://schemas.androID.com/apk/res/androID"        androID:orIEntation="vertical"        androID:layout_wIDth="fill_parent"        androID:layout_height="fill_parent"     >     <com.example.BottomfloatListVIEw.BottomfloatListVIEw       androID:ID="@+ID/ListVIEw"       androID:layout_wIDth="fill_parent"       androID:layout_height="fill_parent"       androID:fadingEdge="none"       />     <include       androID:ID="@+ID/bottombar"       androID:layout_wIDth="match_parent"       androID:layout_height="wrap_content"       androID:layout_alignParentBottom="true"       layout="@layout/bottom_vIEw"       >   </include> </relativeLayout>

3、自定义ListVIEw控件BottomfloatListVIEw

package com.example.BottomfloatListVIEw; import androID.content.Context; import androID.os.Handler; import androID.util.AttributeSet; import androID.util.Log; import androID.vIEw.MotionEvent; import androID.vIEw.VIEw; import androID.vIEw.VIEwGroup; import androID.vIEw.animation.Animation; import androID.vIEw.animation.OvershootInterpolator; import androID.vIEw.animation.TranslateAnimation; import androID.Widget.*; import androID.Widget.AbsListVIEw.OnScrollListener; /**  * 底部VIEw自动隐藏和消失ListvIEw(其他ListVIEw可以继承该类,如CtripBottomrefreshListVIEw类等)  **/ public class BottomfloatListVIEw extends ListVIEw implements OnScrollListener {   public VIEw mBottombar;   private int mCurrentScrollState;   private boolean bIsMoved = false;   private boolean bIsDown = false;   private int mDeltaY;   private float mMotionY;   private int oldFirstVisibleItem = 0;   private Handler mHandler = new Handler();   private static final String TAG = "BottomfloatListVIEw";   public BottomfloatListVIEw(Context context) {     this(context,null);     super.setonScrollListener(this);   }     public BottomfloatListVIEw(Context context,AttributeSet attrs) {     this(context,attrs,0);     super.setonScrollListener(this);   }     public BottomfloatListVIEw(Context context,AttributeSet attrs,int defStyle) {     super(context,defStyle);     super.setonScrollListener(this);   }     @OverrIDe   public voID setAdapter(listadapter adapter) {     super.setAdapter(adapter);   }     @OverrIDe   public voID onScroll(AbsListVIEw vIEw,int firstVisibleItem,int visibleItemCount,int totalitemCount) {       showBottomVIEwOnBottom(visibleItemCount,totalitemCount,firstVisibleItem);     }     @OverrIDe   public voID onScrollStateChanged(AbsListVIEw vIEw,int scrollState) {       hIDeBottomVIEwOnScrollStateChanged(vIEw,scrollState);     }     @OverrIDe   public boolean ontouchEvent(MotionEvent ev) {            float y = ev.getY();      float x = ev.getX();      Log.d("floatListVIEw","ontouchEvent" + "" + x + "" + y);      int action = ev.getAction() & MotionEvent.ACTION_MASK;      switch (action) {        case MotionEvent.ACTION_DOWN:          action_down(y);          break;        case MotionEvent.ACTION_MOVE:          mDeltaY = (int) (y - mMotionY);          bIsMoved = true;          //移动的时候,要移除掉显示bottomVIEw的消息          mHandler.removeCallbacks(showBottombarRunnable);          //补齐action_down事件,因为有的时候,action_down 事件没有执行          action_down(y);          break;        case MotionEvent.ACTION_UP:          bIsMoved = false;          bIsDown = false;          if (!bIsMoved && !bIsDown) {            // 如果屏幕上什么没做,则过2s之后要显示bottomVIEw            mHandler.postDelayed(showBottombarRunnable,2000);          }          if (mDeltaY < 0) { //下滑影藏            hIDeBottombar();          } else { //上滑显示            showBottombar();          }            bIsMoved = false;          break;      }       return super.ontouchEvent(ev);   }           private voID action_down(float y){      mMotionY = y;      bIsDown = true;      Log.d(TAG,"action down execed");      mHandler.removeCallbacks(showBottombarRunnable);   }     /**    * 滑动到顶部时,要隐藏bottomVIEw    * @param vIEw    * @param scrollState    */   private voID hIDeBottomVIEwOnScrollStateChanged(AbsListVIEw vIEw,int scrollState) {     mCurrentScrollState = scrollState;     if(vIEw!=null){        if (vIEw.getFirstVisibleposition() == 0 && scrollState == SCRolL_STATE_IDLE) {          hIDeBottombar();          Log.d(TAG,"hIDe bottom vIEw");        }     }      }     /**    * 显示底部浮动栏    */   public voID showBottombar() {       if (mBottombar != null && mBottombar.getVisibility() == VIEw.GONE) {       mBottombar.setVisibility(VIEw.INVISIBLE);       Animation translateAnimation = new TranslateAnimation(mBottombar.getleft(),mBottombar.getleft(),30,0);       translateAnimation.setDuration(300);       translateAnimation.setInterpolator(new OvershootInterpolator(0.6f));       mBottombar.startAnimation(translateAnimation);       translateAnimation.setAnimationListener(new Animation.AnimationListener() {         @OverrIDe         public voID onAnimationStart(Animation animation) {         }           @OverrIDe         public voID onAnimationRepeat(Animation animation) {         }           @OverrIDe         public voID onAnimationEnd(Animation animation) {           mBottombar.setVisibility(VIEw.VISIBLE);         }       });     }   }     /**    * 隐藏浮动底部栏    */   private voID hIDeBottombar() {           if (mBottombar != null && mBottombar.getVisibility() == VIEw.VISIBLE) {       Animation translateAnimation = new TranslateAnimation(mBottombar.getleft(),30);       translateAnimation.setDuration(300);       translateAnimation.setInterpolator(new OvershootInterpolator(0.6f));       mBottombar.startAnimation(translateAnimation);       translateAnimation.setAnimationListener(new Animation.AnimationListener() {         @OverrIDe         public voID onAnimationStart(Animation animation) {         }           @OverrIDe         public voID onAnimationRepeat(Animation animation) {         }           @OverrIDe         public voID onAnimationEnd(Animation animation) {           mBottombar.setVisibility(VIEw.GONE);         }       });     }   }     /**    * 滑动到底部时直接显示bottomVIEw    * @param visibleItemCount    * @param totalitemCount    * @param firstVisibleItem    */   private voID showBottomVIEwOnBottom(int visibleItemCount,int totalitemCount,int firstVisibleItem) {             Log.d(TAG,"visible bottem item count:" + "firstVisibleItem:" + firstVisibleItem + "oldFirstVisibleItem:" + oldFirstVisibleItem + mBottombar);        if(getLastVisibleposition() ==  totalitemCount -1 && mCurrentScrollState != SCRolL_STATE_IDLE){          showBottombar();        }   }     private Runnable showBottombarRunnable = new Runnable() {       @OverrIDe     public voID run() {       showBottombar();     }     };     /**    * 将需要隐藏显示的vIEw传入    *    * @param bottombar    */   public voID setBottombar(VIEwGroup bottombar) {     this.mBottombar = bottombar;   }   } 

4、主界面测试的Activity,MainActivity代码如下

public class MainActivity extends Activity {   private BottomfloatListVIEw mBottomfloatListVIEw;     @OverrIDe   public voID onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     setContentVIEw(R.layout.main);     mBottomfloatListVIEw = (BottomfloatListVIEw)findVIEwByID(R.ID.ListVIEw) ;     mBottomfloatListVIEw.setAdapter(new ArrayAdapter<String>(this,androID.R.layout.simple_expandable_List_item_1,getData()));     VIEwGroup bottomVIEw = (VIEwGroup)findVIEwByID(R.ID.bottombar) ;     mBottomfloatListVIEw.setBottombar(bottomVIEw);   }     private List<String> getData(){     List<String> data = new ArrayList<String>();     for(int i = 0; i <100; i++)   {       data.add("测试数据" + i);     }     return data;   } }  
VIEwGroup bottomVIEw = (VIEwGroup)findVIEwByID(R.ID.bottombar) ; mBottomfloatListVIEw.setBottombar(bottomVIEw); 

将底部的bottomVIEw传入到ListVIEw中,就可以让ListVIEw具有底部VIEw自动隐藏和消失的功能。 

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

总结

以上是内存溢出为你收集整理的android自定义ListView实现底部View自动隐藏和消失的功能全部内容,希望文章能够帮你解决android自定义ListView实现底部View自动隐藏和消失的功能所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1146557.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存