android listView 下拉刷新的实现
2015-12-25 17:17
537 查看
其实我们在做很多项目都会遇到下拉刷新跟下拉架在这种情况,今天我就简单说一下listView很常用的这种应用下拉刷新吧,那我现在闲话不多说,直接上代码吧。。。
MainActivity.java
然而我们的自定义的适配器为MyAdapter.java
接下来就是一个我们自定义的一个ListView,来实现我们的上啦加载跟下来刷新
首先我们需要考虑的是下拉时的那处顶部header 布局 上边距
还有就是我们加载时我需要通知父布局,占用的宽跟高
当然还有就是我们手指触摸监听啦,也就是我们按钮弹起逻辑 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则是我们的刷新数据接口
reflashViewByState这个方法是主要根据当前状态,改变界面显示
好了,现在刷新功能就基本完成了,是不是感觉也不难啊,嘿嘿,其实若寒还是新手,希望众大神给点点评。
最后大家附上源码链接
http://download.csdn.net/detail/sky1466181491/9376915
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
相关文章推荐
- 在android项目中简单的集成baidu地图之定位功能
- [Android开发]简单版仿淘口令复制弹出框功能
- Android开发疑难杂症之include布局文件
- Android开发之ListView实现Item局部刷新
- Android使用Font Awesome简单介绍
- Android 打包介绍
- android 图片 高斯模糊 Blur Android Studio JNI NDK 生成 so 问题汇总
- Android开发之关于listview中getView()调用两遍的问题
- Android Studio系列教程(三)
- android Settings开发修改定制
- Android内存泄露分析(MemoryAnalyzer工具)
- Ant多渠道打包
- AndroidStudio快捷键
- android cardview
- Ubuntu下为AndroidStudio编译并使用x264(二)AndroidStudio部分
- android图片压缩质量参数Bitmap.Config RGB_565等的含义
- android viewgroup 的事件传递机制学习笔记
- Android获取屏幕宽度与长度的四个方法
- Android Studio系列教程(二)
- Ubuntu下为AndroidStudio编译并使用x264(一)ndk部分