下拉刷新:继承listView控件

1、首先初始化的时候给控件监听OnScrollListener,其中onScroll的参数里得到第一个显示的条目,当第一个条目为0的时候就可以执行下啦刷新了。第二覆写的方法是

onScrollStateChanged就是滑动状态的监听,3种状态都是常量:快速滑动,触摸移动,闲置状态,当为第二种时候调用getlastVisiableposition()得到显示的最后一个条目,当为总条目的个数-1时就可以上移加载更多没在初始化的时候跟header一样加上Foot。当显示最后一个的时候就显示foot,并加载数据。

1下啦刷新时候,可以给listview加一个头,为了开始隐藏头就必须知道头的高度,调用setpadding方法,但是在定义控件时候不知道view的高度,手动调用header.measure()方法测量高度时候出现异常,因为还没有显示是无法测量的(个人认为,在看的较早的视频里发现过定义时候测量的)。我们可以在主程序加载后立即来用measure和setpadding,隐藏listview的头(本文是通过主程序获得后在控件定义中处理的,如果主程序中实现,则ontouchevent和OnScrollListener都得在主程序里实现)。其他的接口之类跟上一篇类似,就不多说了。同样的方法也可以实现:上划到底部加载更多的条目。

注意:方法中简单的设计了触摸移动,没有监听到如果开始1看不见,从顶部划到底部到1出现然后刷新,其中没有记下downY,因此最好的方法是给屏幕上设置3种状态:看不见1和最后一个item;看到1;看到最后一条的状态。一旦看到1就记下为DownY,若看到最后一条则为UpY,其后下啦刷新和上啦加载更多都分三种状态,以下啦为例:下啦、拉到大于一半释放刷新、拉到一定距离后上移。

2、其实每一个空间都是通过计算后才滑到屏幕上的,分别通过measure、onLayout()、ondraw三层,每个控件的大小都是由其父视图和本身决定的,这里不多说看下面几篇文章:http://blog.csdn.net/fengye810130/article/details/9181531;http://blog.csdn.net/guolin_blog/article/details/16330267;http://blog.csdn.net/cauchyweierstrass/article/details/41317247

 下面是自定义的一个下拉刷新的操作:

 3给出code

xml文件

<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"tools:context="com.example.refresh.MainActivity$PlaceholderFragment" ><com.example.refresh.myListView.MyListViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/mylist"/></RelativeLayout>

  header的文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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" ><ProgressBarandroid:id="@+id/progressBar1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="10dp"android:layout_marginTop="3dp" android:visibility="invisible"/><ImageViewandroid:id="@+id/arrow"android:layout_width="wrap_content"android:layout_height="wrap_content"android:background="@drawable/common_listview_headview_red_arrow" android:layout_marginLeft="20dp"android:layout_marginTop="3dp"/><TextView android:id="@+id/tev1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerHorizontal="true"android:layout_marginTop="15dp"android:text="下拉刷新"/><TextView android:id="@+id/tev2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@id/tev1"android:layout_centerHorizontal="true"/>    
</RelativeLayout>

  3控件定义:

package com.example.refresh.myListView;import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;import com.example.refresh.R;import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.rtp.RtpStream;
import android.util.AttributeSet;
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.ListView;
import  android.widget.AbsListView.OnScrollListener;
import android.widget.ProgressBar;
import android.widget.TextView;public class MyListView extends ListView implements OnScrollListener
{private Context context;private final static int UP_MOVE=2;private final static int PREPARE_FLASHING=1;private final static int DOWN_MOVE=0;public View header;private int firstCellIndex;private int headHignt=100;private LoadDatasListener loadDatasListener;public void setOnloadDatasListener(LoadDatasListener l){this.loadDatasListener=l;}public MyListView(Context context) {super(context);this.context=context;init();}public MyListView(Context context, AttributeSet attrs) {super(context, attrs);this.context=context;init();}public MyListView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);this.context=context;init();}public void init(){addHeader();
//		int h=header.getHeight();//测量出现异常
//		System.out.println(h);setOnScrollListener(this);//监听滑动事件,时刻找到第一个显示的控件,即onScroll的第二个参数。}int downY=0;int currentY=0;int dis=0;//记住上一次的移动距离@Overridepublic boolean onTouchEvent(MotionEvent ev) {if(firstCellIndex==0){switch (ev.getAction()) {case MotionEvent.ACTION_DOWN:downY=(int) ev.getY();ProgressBar bar2=(ProgressBar) header.findViewById(R.id.progressBar1);bar2.setVisibility(INVISIBLE);header.findViewById(R.id.arrow).setBackgroundResource(R.drawable.common_listview_headview_red_arrow);header.findViewById(R.id.arrow).setVisibility(VISIBLE);((TextView)header.findViewById(R.id.tev1)).setText("下啦刷新");break;case MotionEvent.ACTION_MOVE:currentY=(int) ev.getY();int dis2=currentY-downY;//pad值int dis3=currentY-downY;//实际disif(dis2>=headHignt){dis2=headHignt;((TextView)header.findViewById(R.id.tev1)).setText("释放刷新");}
//			header.setPadding(0, -headHignt+dis, 0, 0);if(dis3>=dis)header.findViewById(R.id.arrow).setBackgroundResource(R.drawable.common_listview_headview_red_arrow);if(dis3<dis){//向上移动时header.findViewById(R.id.arrow).setBackgroundResource(R.drawable.up);}dis=dis3;header.setPadding(0, dis2-headHignt, 0, 0);break;case MotionEvent.ACTION_UP:Calendar c = Calendar.getInstance();int year = c.get(Calendar.YEAR); int month = c.get(Calendar.MONTH)+1;//月是从0开始的 int date = c.get(Calendar.DATE); int hour = c.get(Calendar.HOUR_OF_DAY); int minute = c.get(Calendar.MINUTE); String time="上次刷新:"+year+"-"+month+"-"+date+" "+hour+":"+minute;TextView t=(TextView) header.findViewById(R.id.tev2);t.setText(time);ProgressBar bar=(ProgressBar) header.findViewById(R.id.progressBar1);bar.setVisibility(View.VISIBLE);header.findViewById(R.id.arrow).setVisibility(INVISIBLE);((TextView)header.findViewById(R.id.tev1)).setText("正在刷新");if(dis>headHignt/2)header.setPadding(0, 0, 0, 0);else{header.setPadding(0, -headHignt, 0, 0);loadDatasListener.onloadData();}dis=0;break;default:break;}}return super.onTouchEvent(ev);}public void addHeader(){header=View.inflate(context, R.layout.header, null);
//		header.measure(0, 0);//		System.out.println(this.getMeasuredHeight());addHeaderView(header);header.setPadding(0, -headHignt, 0, 0);}@Overridepublic void onScrollStateChanged(AbsListView view, int scrollState) {// TODO Auto-generated method stub}@Overridepublic void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount) {firstCellIndex=firstVisibleItem;}}

  4控件接口:

package com.example.refresh.myListView;public interface LoadDatasListener {public void onloadData();}

  5 activity文件

public class MainActivity extends Activity {private MyListView list;private ArrayList<String> newsdata;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);list=(MyListView) findViewById(R.id.mylist);init();list.setAdapter(new MyListAdapter());list.measure(0, 0);
//        list.header.getMeasuredHeight();System.out.println(list.header.getMeasuredHeight());}class MyListAdapter extends BaseAdapter {@Overridepublic int getCount() {// TODO Auto-generated method stubreturn newsdata.size();}@Overridepublic Object getItem(int position) {// TODO Auto-generated method stubreturn newsdata.get(position);}@Overridepublic long getItemId(int position) {// TODO Auto-generated method stubreturn position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {TextView view=null;ViewHolder holder=null;if(convertView!=null){holder=(ViewHolder) convertView.getTag();view=holder.txview;}else {view=new TextView(MainActivity.this);holder=new ViewHolder();holder.txview=view;view.setTag(holder);}view.setText(newsdata.get(position));return view;}}static class  ViewHolder {TextView txview;}public void init(){newsdata=new ArrayList<String>();for(int x=0;x<30;x++)newsdata.add("新闻条目:"+x);}}

  

 

转载于:https://www.cnblogs.com/bokeofzp/p/4769825.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/290555.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件项目组织管理(二、三)项目管理与信息技术环境、项目管理过程组

文章目录系统方法系统管理三维模型组织环境组织的四个框架组织的结构项目生命周期管理评审虚拟团队什么是过程项目管理过程组系统方法 项目管理工作需要采取系统的方法&#xff0c;描述在解决复杂问题时所需的整体性和分析性方法。 系统哲学&#xff1a;将事情作为系统考虑的…

《编译与反编译技术》—第1章1.7节C语言程序的编译流程

本节书摘来自华章出版社《编译与反编译技术》一书中的第1章&#xff0c;第1.7节C语言程序的编译流程&#xff0c;作者庞建民&#xff0c;陶红伟&#xff0c;刘晓楠&#xff0c;岳峰&#xff0c;更多章节内容可以访问云栖社区“华章计算机”公众号查看。1.7 C语言程序的编译流程…

Base64

2019独角兽企业重金招聘Python工程师标准>>> Base64是一种基于64个可打印字符来表示二进制数据的表示方法。由于2的6次方等于64&#xff0c;所以每6个比特为一个单元&#xff0c;对应某个可打印字符。三个字节有24个比特&#xff0c;对应于4个Base64单元&#xff0c…

软件配置管理(六)常用配置软件配置工具指令

文章目录软件配置管理工具的主要功能两种版本控制模型Lock-Modify-UnlockCopy-Modify-MergeSubversionGit软件配置管理工具的主要功能 版本控制变更管理配置审核配置状态统计问题跟踪访问控制和安全控制 两种版本控制模型 Lock-Modify-Unlock “加锁-修改-解锁”模型 对于版…

.NET 6 攻略大全(一)

点击上方蓝字关注我们&#xff08;本文阅读时间&#xff1a;15分钟)欢迎使用 .NET 6。今天的版本是.NET 团队和社区一年多努力的结果。C# 10 和 F# 6 提供了语言改进&#xff0c;使您的代码更简单、更好、性能大幅提升&#xff0c;我们已经看到微软降低了托管云服务的成本。.NE…

Win7下JDK环境变量的设置

JDK并不像Microsoft阵营vs那样智能&#xff0c;安装好后所有的东西都给你配置好了&#xff0c;我们还没需要手动配置很多东西 首先说为什么要配置JDK的环境变量在任何路径下识别java命令和java类 配置分为2个部分&#xff0c;1&#xff0c;java命令路径。2,java加载类 分为3个步…

简单模拟实现简单的当登录延时的效果

①、先建立一个activaty去部署我们的登陆界面 1 package com.example.administrator.actionbardemo;2 3 import android.app.Activity;4 import android.content.Intent;5 import android.os.Bundle;6 import android.view.View;7 import android.widget.Button;8 import andro…

《音乐达人秀:Adobe Audition实战200例》——实例11 录制任意音量音乐

本节书摘来自异步社区《音乐达人秀&#xff1a;Adobe Audition实战200例》一书中的第2章&#xff0c;实例11 &#xff0c;作者 健逗&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看。 实例11 录制任意音量音乐 这个实例将讲解如何任意控制录音过程中的音量。你…

我的技术回顾2019不止技术的一年

这篇本想具体说下ABP的商业模式的演进与变化&#xff0c;因为愿意像我这样花费心力去研究他的人不多。写着的时候&#xff0c;就得没必要。真有这种想法的人&#xff0c;也会自己研究&#xff0c;我何必去写呢。2019年初&#xff0c;因为各种原因&#xff0c;加上企业资源的调整…

linux之在当前目录下删除不包含aa的文件

1、问题 1、当前目录下删除不包含aa的文件和文件夹2、解决办法 1、rm -rf ls -al | grep -v "aa"

设计模式(1)--简单工厂模式、策略模式

设计模式&#xff08;1&#xff09;--简单工厂模式、策略模式 1. 简单工厂模式 在阎宏博士的《JAVA与模式》一书中开头是这样描述简单工厂模式的&#xff1a;简单工厂模式是类的创建模式&#xff0c;又叫做静态工厂方法&#xff08;Static Factory Method&#xff09;模式。简单…

kmp算法讲解

转自——http://blog.csdn.net/v_july_v/article/details/7041827 看到kmp是不是立即想到(*ο*) 哇&#xff5e;&#xff0c;那个东西啊&#xff0c;就是拿来放电影的那个啊&#xff01; 哦&#xff0c;但是这里我们说的并不是那个东西&#xff0c;身为一名C选手&#xff0c;我…

TLS/SSL协议工作原理

1、TLS/SSL的功能实现原理简单介绍 HTTPS协议的主要功能基本都依赖于TLS/SSL协议,TLS/SSL的功能实现主要依赖于三类基本算法:散列函数 Hash、对称加密和非对称加密,其利用非对称加密实现身份认证和密钥协商,对称加密算法采用协商的密钥对数据加密,基于散列函数验证信息的…

实现DDD领域驱动设计: Part 4

原文链接: https://dev.to/salah856/implementing-domain-driven-design-part-iv-29m2对象到对象映射当两个对象具有相同或相似的属性时&#xff0c;自动对象到对象映射是一种将值从一个对象复制到另一个对象的有用方法。DTO和实体类通常具有相同/相似的属性&#xff0c;你通常…

软件项目组织管理(六)项目时间管理

文章目录项目计划和进度计划什么是活动活动清单活动属性里程碑时间管理的过程1. 活动定义2. 活动排序三种依赖关系箭线图法&#xff08;ADM&#xff09;/双代号网络&#xff08;AOA&#xff09;前导图法&#xff08;PDM&#xff09;/单代号网络&#xff08;AON&#xff09;3. 活…

win7开机按F8后,为什么没有修复计算机的选项

有时win7开机按F8后&#xff0c;没有修复计算机的选项本文将向大家介绍如何通过 Windows 7自带的“配置 Windows 恢复环境(RE)”命令 – ReagentC.exe&#xff0c;启用“高级启动选项”下的“修复计算机”选项。单击 Windows 开始图标&#xff0c;在“搜索程序和文件”输入框中…

TLS/SSL握手过程

参考了:https://www.wosign.com/faq/faq2016-0309-04.htm 1、握手与密钥协商过程 基于RSA握手和密钥交换的客户端验证服务器为示例详解TLS/SSL握手过程。 (1).client_hello 客户端发起请求,以明文传输请求信息,包含版本信息,加密套件候选列表,压缩算法候选列表,随机数,扩…

FluentValidation在C#中是怎么进行数据验证的

介绍FluentValidation 是一个基于 .NET 开发的验证框架&#xff0c;用于构建强类型验证规则的 .NET 库。开源免费支持 .Net所有平台 包括.NetFramework和.NetCore.FluentValidation 组件内提供十几种常用验证器&#xff0c;可扩展性好&#xff0c;支持自定义验证器&#xff0c;…

基于Metronic的Bootstrap开发框架经验总结(5)--Bootstrap文件上传插件File Input的使用...

Bootstrap文件上传插件File Input是一个不错的文件上传控件&#xff0c;但是搜索使用到的案例不多&#xff0c;使用的时候&#xff0c;也是一步一个脚印一样摸着石头过河&#xff0c;这个控件在界面呈现上&#xff0c;叫我之前使用过的Uploadify 好看一些&#xff0c;功能也强大…

软件项目组织管理(七)项目成本管理

文章目录什么是成本什么是项目成本学习曲线理论储备金什么是项目成本管理目的过程成本估算成本估算的工具和技术成本预算主要工作成本估算和成本预算的关系和区别成本管理的工具方法净现值投资回报率挣值分析法什么是成本 为达到一个特定目标而花费的资源。 什么是项目成本 …