ListView下拉刷新
来源:互联网 发布:机器人编程实战 编辑:程序博客网 时间:2024/06/05 02:57
首先建立ListHeader的布局文件。用于存放下拉菜单
<?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:paddingTop="10dp" android:paddingBottom="10dp" > <FrameLayout android:layout_weight="1" android:id="@+id/frame" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" > <ImageView android:id="@+id/img" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:src="@drawable/ic_launcher" /> <ProgressBar android:id="@+id/progressbar" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" /> </FrameLayout> <TextView android:id="@+id/mytitle" android:layout_weight="2" android:layout_width="0dp" android:layout_height="wrap_content" android:textSize="24sp" android:layout_gravity="center" android:text="下拉刷新" /></LinearLayout>
package com.example.myview;import java.util.ArrayList;import java.util.List;import android.content.Context;import android.util.AttributeSet;import android.util.Log;import android.view.LayoutInflater;import android.view.MotionEvent;import android.view.View;import android.view.animation.Animation;import android.view.animation.RotateAnimation;import android.widget.AbsListView;import android.widget.AbsListView.OnScrollListener;import android.widget.ArrayAdapter;import android.widget.ImageView;import android.widget.ListAdapter;import android.widget.ListView;import android.widget.ProgressBar;import android.widget.TextView;public class My_listview extends ListView implements OnScrollListener{View header;TextView tv;ImageView iv;ProgressBar probar;Animation anim_downToUp;Animation anim_UpToDown;int headerHigth=0; //判断第一条被滑出的高度public My_listview(Context context, AttributeSet attrs) {super(context, attrs);initAnimation();//执行动画header=(View)LayoutInflater.from(context).inflate(R.layout.list_header, null);tv=(TextView)header.findViewById(R.id.mytitle);iv=(ImageView)header.findViewById(R.id.img);probar=(ProgressBar)header.findViewById(R.id.progressbar);probar.setVisibility(View.INVISIBLE); //设置滚动条初始状态为不可见addHeaderView(header); setSelection(1); headerHigth=getHeaderViewHeight();//获取下拉菜单的高度setOnScrollListener(this);} <pre name="code" class="java"> //获取下拉菜单的高度
private int getHeaderViewHeight() {android.view.ViewGroup.LayoutParams params=header.getLayoutParams();if(params==null){params=new LayoutParams(android.view.ViewGroup.LayoutParams.MATCH_PARENT,android.view.ViewGroup.LayoutParams.WRAP_CONTENT);}int with=MeasureSpec.makeMeasureSpec(params.width, MeasureSpec.EXACTLY);int height=MeasureSpec.makeMeasureSpec(params.height, MeasureSpec.EXACTLY);header.measure(with, height);Log.i("==================", " 高度"+header.getMeasuredHeight());return header.getMeasuredHeight();}int myscrollState;//获取滑动的方式boolean flag=true;//判断下滑菜单状态@Overridepublic void onScrollStateChanged(AbsListView view, int scrollState) {// TODO Auto-generated method stubmyscrollState=scrollState;}@Overridepublic void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount) {// TODO Auto-generated method stub//判断是否是手指滑动触发的事件if(myscrollState==SCROLL_STATE_TOUCH_SCROLL){//判断是否滑动到第一条if(firstVisibleItem==0){//getBottom获取header控件的下标if(header.getBottom()<headerHigth){ //判断菜单是否被完全拉出
iv.setVisibility(View.VISIBLE);probar.setVisibility(view.INVISIBLE);tv.setText(" 下拉刷新...... ");iv.startAnimation(anim_UpToDown);flag=false;}else if(header.getBottom() >=headerHigth){iv.setVisibility(View.VISIBLE);probar.setVisibility(view.INVISIBLE);tv.setText(" 释放开始刷新...... ");iv.startAnimation(anim_downToUp);flag=true;}}}}
//设置动画效果private void initAnimation() {anim_downToUp = new RotateAnimation(0, -180,Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,0.5f);anim_downToUp.setDuration(300);anim_downToUp.setFillAfter(true);anim_UpToDown = new RotateAnimation(-180, 0,Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,0.5f);anim_UpToDown.setDuration(300);anim_UpToDown.setFillAfter(true);} //当手指抬起时的事件@Overridepublic boolean onTouchEvent(MotionEvent ev) {// TODO Auto-generated method stubif(ev.getAction()==MotionEvent.ACTION_UP){
//下拉菜单被完全拉出时 if(flag){iv.clearAnimation();//清除动画iv.setVisibility(View.INVISIBLE);probar.setVisibility(View.VISIBLE);tv.setText("正在刷新。。。");if(listener!=null){listener.onRefresh();}}else{iv.clearAnimation();setSelection(1);}}return super.onTouchEvent(ev);}public void refreshFinish() {invalidateViews(); //刷新页面,即刷新listview中所有的子Viewsiv.clearAnimation();setSelection(1);}OnRefreshListener listener;public void setListener(OnRefreshListener listener) {this.listener = listener;} //设置抽象类 用于接口回调。添加事件public interface OnRefreshListener{void onRefresh();} @Overridepublic void setAdapter(ListAdapter adapter) {// TODO Auto-generated method stubsuper.setAdapter(adapter);setSelection(1);}}
第三步在主布局文件中添加自定义ListView的控件
<com.example.myview.My_listview android:id="@+id/listview" android:layout_width="fill_parent" android:layout_height="<span style="font-family: Arial, Helvetica, sans-serif;">fill_parent</span>" />
第四步在主线程中设置事件
package com.example.myview;import java.util.ArrayList;import java.util.List;import com.example.myview.My_listview.OnRefreshListener;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.util.Log;import android.view.Window;import android.widget.ArrayAdapter;public class MainActivity extends Activity {My_listview listview;List<String>list=new ArrayList<String>();ArrayAdapter< String >adapter;int num=0;//新添加的数据Handler handler = new Handler();//延迟加载数据@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.activity_main); for(int i=0;i<20;i++){ list.add("item"+i); } adapter=new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_spinner_dropdown_item,list); listview.setAdapter(adapter); listview.setListener(new OnRefreshListener() { @Overridepublic void onRefresh() {// TODO Auto-generated method stubLog.i("=====", "============开始下拉刷新");handler.postDelayed(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubnum++;list.add(0,"新添加的数据"+num);//刷新页面listview.refreshFinish();}}, 2000);}});}}
完全没有想象中的那么复杂。。。。。。。
0 0
- ListView下拉回弹刷新
- ListView下拉刷新
- listView下拉刷新2
- ListView 下拉刷新错误
- Android ListView下拉刷新
- listview下拉刷新
- listview实现下拉刷新
- ListView下拉刷新
- android Listview下拉刷新
- ListView下拉回弹刷新
- Android ListView下拉刷新
- 自定义ListView,下拉刷新
- listview 下拉刷新
- ListView下拉刷新
- ListView下拉刷新
- ListView实现下拉刷新
- ListView下拉回弹刷新
- Listview的下拉刷新
- Android学习——对话框Dialog
- leetcode: (121) Best Time to Buy and Sell Stock
- java中显示类型转换和隐式类型转换
- Bubble Cup 8 - Finals [Online Mirror]
- HelloWorld
- ListView下拉刷新
- 九九乘法表的输出
- hdu 4707 Pet(深搜)
- hdoj 1159 Common Subsequence 【LCS】
- c++构造函数&析构函数
- 2种二分查找及2种优化方式
- 非线性拟合lsqcurvefit、nlinfit
- 年总结—自强不息
- 中国的大数据何时能够落地生金