ListView上下拉刷新
2015-11-11 10:35
302 查看
listview的上下拉刷新在大部分的app中都有用到,可以使用第三方的PullToRefresh框架也可以自定义listview控件。下面是自定义的listview类:
activity中的调用方法:
顶部布局文件如下:
底部布局文件如下:
public class LoadListView extends ListView implements OnScrollListener{ View footer;//底部布局 int totalItemCount;//总数量 int lastVisibleItem;//最后一个可见的item boolean isLoading =false;//正在加载 ILoadListener iLoadListener; View header; int headerHeight;//顶部布局文件的高度 int firstVisibleItem; boolean isRemark;//標記,當前實在listview 最頂端按下的。 int startY;//按下時的Y值 int state;//當前的狀態 final int NONE = 0 ;//正常狀態 final int PULL = 1;//提示下拉狀態 final int RELESE = 2;//提示釋放狀態 final int REFLASHING = 3;//刷新狀態 int scrollState;//當前滾動狀態 IReflashListener iReflashListener;//刷新數據的接口 public LoadListView(Context context) { super(context); initView(context); } public LoadListView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); initView(context); } public LoadListView(Context context, AttributeSet attrs) { super(context, attrs); initView(context); } /** * 添加底部加载提示到ListView * 添加顶部加载提示到ListView * @param context */ private void initView(Context context){ //上拉加载 LayoutInflater inflater = LayoutInflater.from(context); footer=inflater.inflate(R.layout.footer_layout,null); footer.findViewById(R.id.txt).setVisibility(View.INVISIBLE); this.setOnScrollListener(this);//设置滚动监听 this.addFooterView(footer); //下拉刷新 header=inflater.inflate(R.layout.header_layout,null); measureView(header); headerHeight = header.getMeasuredHeight(); topPadding(-headerHeight); this.addHeaderView(header); } //计算顶部占多大 private void measureView(View v){ ViewGroup.LayoutParams p = v.getLayoutParams(); if(p==null){ p=new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT); } int width = ViewGroup.getChildMeasureSpec(0,0,p.width); int height; int tempheight=p.height; if(tempheight>0){ height = MeasureSpec.makeMeasureSpec(tempheight,MeasureSpec.EXACTLY);//得到的是tempheight }else{ height = MeasureSpec.makeMeasureSpec(0,MeasureSpec.UNSPECIFIED);//得到的是字布局的实际大小 } v.measure(width, height); } public void topPadding(int topPadding){ header.setPadding(header.getPaddingLeft(),topPadding,header.getPaddingRight(),header.getPaddingBottom()); header.invalidate(); } public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { //DOTO 下拉中 this.lastVisibleItem=firstVisibleItem+visibleItemCount; this.totalItemCount=totalItemCount; this.firstVisibleItem=firstVisibleItem; } @Override public boolean onTouchEvent(MotionEvent ev) { switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: if(firstVisibleItem==0){ isRemark=true; startY=(int) ev.getY(); } break; case MotionEvent.ACTION_MOVE: onMove(ev); break; case MotionEvent.ACTION_UP: if(state==RELESE){ state=REFLASHING; reflashViewByState(); //加載最新數據 iReflashListener.onReflash(); }else if(state==PULL){ state=NONE; isRemark=false; reflashViewByState(); } break; default: break; } return super.onTouchEvent(ev); } private void reflashViewByState(){ TextView tip = (TextView) header.findViewById(R.id.tip); ImageView arrow = (ImageView) header.findViewById(R.id.imag); ProgressBar progress=(ProgressBar) header.findViewById(R.id.progress); RotateAnimation anim = new RotateAnimation(0,180, RotateAnimation.RELATIVE_TO_SELF,0.5f, RotateAnimation.RELATIVE_TO_SELF,0.5f); anim.setDuration(500); anim.setFillAfter(true); RotateAnimation anim1 = new RotateAnimation(180,0, RotateAnimation.RELATIVE_TO_SELF,0.5f, RotateAnimation.RELATIVE_TO_SELF,0.5f); anim1.setDuration(500); anim1.setFillAfter(true); switch (state) { case NONE: topPadding(-headerHeight); break; case PULL: arrow.setVisibility(View.VISIBLE); progress.setVisibility(View.INVISIBLE); tip.setText(getResources().getString(R.string.xialashuxin)); arrow.clearAnimation(); arrow.setAnimation(anim1); break; case RELESE: arrow.setVisibility(View.VISIBLE); progress.setVisibility(View.INVISIBL 10428 E); tip.setText(getResources().getString(R.string.songkaishuxin)); arrow.clearAnimation(); arrow.setAnimation(anim); break; case REFLASHING: topPadding(50); arrow.setVisibility(View.INVISIBLE); progress.setVisibility(View.VISIBLE); tip.setText(getResources().getString(R.string.zenzaishuxin)); arrow.clearAnimation(); break; default: break; } } private void onMove(MotionEvent ev) { if(!isRemark){ return; } int tempY=(int) ev.getY(); int space = tempY-startY; int topPadding = space-headerHeight; switch (state) { case NONE: if(space>0){ state=PULL; reflashViewByState(); } break; case PULL: topPadding(topPadding); if(space>headerHeight+30 && scrollState==SCROLL_STATE_TOUCH_SCROLL){ state=RELESE; reflashViewByState(); } break; case RELESE: topPadding(topPadding); if(space<headerHeight+30){ state=PULL; reflashViewByState(); }else if(space<0){ state=NONE; isRemark=false; reflashViewByState(); } break; case REFLASHING: break; default: break; } } /** * 下拉刷新完成 */ public void reflashComplete(){ state = NONE; isRemark = false; reflashViewByState(); TextView lastupdatetime = (TextView) header.findViewById(R.id.lasttime); SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日"); Date date = new Date(System.currentTimeMillis()); String time = format.format(date); lastupdatetime.setText(time); } public void setReflashInterface(IReflashListener iListener){ this.iReflashListener=iListener; } public interface IReflashListener{ public void onReflash(); } public void onScrollStateChanged(AbsListView view, int scrollState) { //DOTO 滑动状态改变 if(totalItemCount==lastVisibleItem && scrollState==SCROLL_STATE_IDLE){ footer.findViewById(R.id.txt).setVisibility(View.VISIBLE); if(!isLoading){ isLoading=true; //footer.findViewById(R.id.txt).setVisibility(View.VISIBLE); //加载更多 iLoadListener.onLoad(); } } this.scrollState=scrollState; } public void setInterface(ILoadListener iLoadListener){ this.iLoadListener=iLoadListener; } public interface ILoadListener{ public void onLoad(); } /** * 上拉加載完成 */ public void loadComplete(){ isLoading=false; footer.findViewById(R.id.txt).setVisibility(View.INVISIBLE); } }
activity中的调用方法:
//activity实现上拉、下拉监听 public class Main extends Activity implements ILoadListener,IReflashListener { private LoadListView list; boolean isloading=false; boolean isReflashing=false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); list = (LoadListView) findViewById(R.id.list); //隐藏listview头布局 list.setHeaderDividersEnabled(false); //隐藏listview底部布局 list.setFooterDividersEnabled(false); //设置listview的上拉加载监听 list.setInterface(this); //设置listview的下拉刷新监听 list.setReflashInterface(this); } public void onReflash() { //更新listview数据 } } public void onLoad() { //更新listview数据 } } }
顶部布局文件如下:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" android:paddingTop="10dp" android:paddingBottom="10dp" > <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" android:layout_centerInParent="true" android:id="@+id/layout" android:gravity="center" > <TextView android:id="@+id/tip" android:text="@string/xialashuxin" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/lasttime" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> <ImageView android:id="@+id/imag" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toLeftOf="@id/layout" android:layout_marginRight="20dp" android:src="@drawable/pull_to_refresh_arrow" /> <ProgressBar android:id="@+id/progress" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toLeftOf="@id/layout" android:layout_marginRight="20dp" style="?android:attr/progressBarStyleSmall" android:visibility="gone" /> </RelativeLayout> </LinearLayout>
底部布局文件如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <LinearLayout android:id="@+id/txt" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:paddingTop="10dp" android:paddingBottom="10dp" android:gravity="center" > <ProgressBar android:layout_width="wrap_content" android:layout_height="wrap_content" style="?android:attr/progressBarStyleSmall" /> <!-- <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="正在加载..." /> --> </LinearLayout> </LinearLayout>
相关文章推荐
- 完美实现Android ListView中的TextView的跑马灯效果
- android上改变listView的选中颜色
- flex 控件的重要属性
- Delphi7中Listview的常用功能汇总
- Delphi控件ListView的属性及使用方法详解
- web下载的ActiveX控件自动更新
- WinForm实现按名称递归查找控件的方法
- C#中父窗口和子窗口之间控件互操作实例
- Android编程之Button控件用法实例分析
- Android控件之CheckBox、RadioButton用法实例分析
- android中ListView数据刷新时的同步方法
- Android提高之ListView实现自适应表格的方法
- Android中实现水平滑动(横向滑动)ListView示例
- MFC中动态创建控件以及事件响应实现方法
- WinForm自定义函数FindControl实现按名称查找控件
- Android控件之ProgressBar用法实例分析
- WinForm拖拽控件生成副本的解决方法
- C#实现ListView选中项向上或向下移动的方法
- ASP.NET动态添加用户控件的方法
- C# Word转PDF/HTML/XML/XPS/SVG/EMF/EPUB/TIFF