您的位置:首页 > 移动开发 > Android开发

android listView 下拉刷新的实现

2015-12-25 17:17 537 查看
其实我们在做很多项目都会遇到下拉刷新跟下拉架在这种情况,今天我就简单说一下listView很常用的这种应用下拉刷新吧,那我现在闲话不多说,直接上代码吧。。。

MainActivity.java

package com.imooc.listviewfrashdemo1;
/**
* @author 家铄
* @QQ1466181491
*/
import java.util.ArrayList;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;

import com.example.listviewfrashdemo1.R;
import com.imooc.listviewfrashdemo1.ReFlashListView.IReflashListener;

public class MainActivity extends Activity implements IReflashListener{
ArrayList<ApkEntity> apk_list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setData();
showList(apk_list);
}

MyAdapter adapter;
ReFlashListView listview;
private void showList(ArrayList<ApkEntity> apk_list) {
if (adapter == null) {
listview = (ReFlashListView) findViewById(R.id.listview);
listview.setInterface(this);
adapter = new MyAdapter(this, apk_list);
listview.setAdapter(adapter);
} else {
adapter.onDateChange(apk_list);
}
}

private void setData() {
apk_list = new ArrayList<ApkEntity>();
for (int i = 0; i < 10; i++) {
ApkEntity entity = new ApkEntity();
entity.setName("默认数据");
entity.setDes("这是一个神奇的应用");
entity.setInfo("50w用户");
apk_list.add(entity);
}
}

private void setReflashData() {
for (int i = 0; i < 2; i++) {
ApkEntity entity = new ApkEntity();
entity.setName("刷新数据");
entity.setDes("这是一个神奇的应用");
entity.setInfo("50w用户");
apk_list.add(0,entity);
}
}
@Override
public void onReflash() {
// TODO Auto-generated method stub\
Handler handler = new Handler();
handler.postDelayed(new Runnable() {

@Override
public void run() {
// TODO Auto-generated method stub
//获取最新数据
setReflashData();
//通知界面显示
showList(apk_list);
//通知listview 刷新数据完毕;
listview.reflashComplete();
}
}, 2000);

}
}


然而我们的自定义的适配器为MyAdapter.java

package com.imooc.listviewfrashdemo1;

import java.util.ArrayList;

import com.example.listviewfrashdemo1.R;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class MyAdapter extends BaseAdapter {
ArrayList<ApkEntity> apk_list;
LayoutInflater inflater;

public MyAdapter(Context context, ArrayList<ApkEntity> apk_list) {
this.apk_list = apk_list;
this.inflater = LayoutInflater.from(context);
}

public void onDateChange(ArrayList<ApkEntity> apk_list) {
this.apk_list = apk_list;
this.notifyDataSetChanged();
}

@Override
public int getCount() {
// TODO Auto-generated method stub
return apk_list.size();
}

@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return apk_list.get(position);
}

@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
ApkEntity entity = apk_list.get(position);
ViewHolder holder;
if (convertView == null) {
holder = new ViewHolder();
convertView = inflater.inflate(R.layout.item_layout, null);
holder.name_tv = (TextView) convertView
.findViewById(R.id.item3_apkname);
holder.des_tv = (TextView) convertView
.findViewById(R.id.item3_apkdes);
holder.info_tv = (TextView) convertView
.findViewById(R.id.item3_apkinfo);
convertView.setTag(holder);
}else{
holder = (ViewHolder) convertView.getTag();
}
holder.name_tv.setText(entity.getName());
holder.des_tv.setText(entity.getDes());
holder.info_tv.setText(entity.getInfo());
return convertView;
}

class ViewHolder {
TextView name_tv;
TextView des_tv;
TextView info_tv;
}
}


接下来就是一个我们自定义的一个ListView,来实现我们的上啦加载跟下来刷新

首先我们需要考虑的是下拉时的那处顶部header 布局 上边距

private void topPadding(int topPadding) {
header.setPadding(header.getPaddingLeft(), topPadding,
header.getPaddingRight(), header.getPaddingBottom());
header.invalidate();
}


还有就是我们加载时我需要通知父布局,占用的宽跟高

private void measureView(View view) {
ViewGroup.LayoutParams p = view.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);
} else {
height = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
}
view.measure(width, height);
}


当然还有就是我们手指触摸监听啦,也就是我们按钮弹起逻辑 MotionEvent.ACTION_UP

case MotionEvent.ACTION_UP: if (state == RELESE) {

state = REFLASHING;

// 加载最新数据;

reflashViewByState();

iReflashListener.onReflash(); } else if (state == PULL) {

state = NONE;

isRemark = false;

reflashViewByState(); } break; }

而其中的IReflashListener则是我们的刷新数据接口

public interface IReflashListener{
public void onReflash();
}


reflashViewByState这个方法是主要根据当前状态,改变界面显示

private void reflashViewByState() {
TextView tip = (TextView) header.findViewById(R.id.tip);
ImageView arrow = (ImageView) header.findViewById(R.id.arrow);
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:
arrow.clearAnimation();
topPadding(-headerHeight);
break;

case PULL:
arrow.setVisibility(View.VISIBLE);
progress.setVisibility(View.GONE);
tip.setText("下拉可以刷新!");
arrow.clearAnimation();
arrow.setAnimation(anim1);
break;
case RELESE:
arrow.setVisibility(View.VISIBLE);
progress.setVisibility(View.GONE);
tip.setText("松开可以刷新!");
arrow.clearAnimation();
arrow.setAnimation(anim);
break;
case REFLASHING:
topPadding(50);
arrow.setVisibility(View.GONE);
progress.setVisibility(View.VISIBLE);
tip.setText("正在刷新...");
arrow.clearAnimation();
break;
}
}


好了,现在刷新功能就基本完成了,是不是感觉也不难啊,嘿嘿,其实若寒还是新手,希望众大神给点点评。

最后大家附上源码链接

http://download.csdn.net/detail/sky1466181491/9376915
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: