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>


第二步建立一个自定义的ListView对象

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
原创粉丝点击