• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > Android—自定义控件实现ListView下拉刷新,androidlistview

Android—自定义控件实现ListView下拉刷新,androidlistview

作者:网友 字体:[增加 减小] 来源:互联网 时间:2017-05-26

网友通过本文主要向大家介绍了android listview控件,android listview下拉,android listview,android listview优化,android 横向listview等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

Android—自定义控件实现ListView下拉刷新,androidlistview


这篇博客为大家介绍一个android常见的功能——ListView下拉刷新(参考自他人博客,网址忘记了,阅读他的代码自己理解注释的,希望能帮助到大家):

首先下拉未松手时候手机显示这样的界面:

下面的代码是自定的扎样的控件:

package com.dhsr.smartID.view;

import android.content.Context;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.RotateAnimation;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;

import com.example.sirelinkscanapp.R;

/**
 * 自定义控件,完成下拉时候ListView显示“图标及提示正在刷新……”的布局
 * 
 * @author cyf
 * 
 */
public class XListViewHeader extends LinearLayout {
	private LinearLayout mContainer;
	// 图片
	private ImageView mArrowImageView;
	// 圆形进度条
	private ProgressBar mProgressBar;
	private TextView mHintTextView;
	// 状态
	private int mState = STATE_NORMAL;
	// 动画
	private Animation mRotateUpAnim;
	private Animation mRotateDownAnim;
	private final int ROTATE_ANIM_DURATION = 180;
	// 正常
	public final static int STATE_NORMAL = 0;
	// 准备刷新
	public final static int STATE_READY = 1;
	// 刷新中
	public final static int STATE_REFRESHING = 2;

	public XListViewHeader(Context context) {
		super(context);
		initView(context);
	}

	/**
	 * @param context
	 * @param attrs
	 */
	public XListViewHeader(Context context, AttributeSet attrs) {
		super(context, attrs);
		initView(context);
	}

	/**
	 * “ 松开即可刷新……正在刷新……”的布局
	 * 
	 * @param context
	 */
	private void initView(Context context) {
		// 初始情况,设置下拉刷新view高度为0
		LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
				LayoutParams.MATCH_PARENT, 0);
		mContainer = (LinearLayout) LayoutInflater.from(context).inflate(
				R.layout.xlistview_header, null);
		// 加载视图
		addView(mContainer, lp);
		// 居中方式
		setGravity(Gravity.BOTTOM);
		// 初始化控件
		mArrowImageView = (ImageView) findViewById(R.id.xlistview_header_arrow);
		mHintTextView = (TextView) findViewById(R.id.xlistview_header_hint_textview);
		mProgressBar = (ProgressBar) findViewById(R.id.xlistview_header_progressbar);
		// 设置动画
		mRotateUpAnim = new RotateAnimation(0.0f, -180.0f,
				Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
				0.5f);
		mRotateUpAnim.setDuration(ROTATE_ANIM_DURATION);
		mRotateUpAnim.setFillAfter(true);
		mRotateDownAnim = new RotateAnimation(-180.0f, 0.0f,
				Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
				0.5f);
		mRotateDownAnim.setDuration(ROTATE_ANIM_DURATION);
		mRotateDownAnim.setFillAfter(true);
	}

	/**
	 * 根据下拉状态执行相应的功能,开始以及停止相应的动画
	 * 
	 * @param state
	 */
	public void setState(int state) {
		if (state == mState)
			return;
		if (state == STATE_REFRESHING) { // 显示进度
			mArrowImageView.clearAnimation();
			mArrowImageView.setVisibility(View.INVISIBLE);
			mProgressBar.setVisibility(View.VISIBLE);
		} else { // 显示箭头图片
			mArrowImageView.setVisibility(View.VISIBLE);
			mProgressBar.setVisibility(View.INVISIBLE);
		}
		switch (state) {
		
		case STATE_NORMAL:
			if (mState == STATE_READY) {
				// 开始动画
				mArrowImageView.startAnimation(mRotateDownAnim);
			}
			//刷新中
			if (mState == STATE_REFRESHING) {
				// 清除动画
				mArrowImageView.clearAnimation();
			}
			mHintTextView.setText(R.string.xlistview_header_hint_normal);
			break;
		case STATE_READY:
			if (mState != STATE_READY) {
				mArrowImageView.clearAnimation();
				mArrowImageView.startAnimation(mRotateUpAnim);
				mHintTextView.setText(R.string.xlistview_header_hint_ready);
			}
			break;
		case STATE_REFRESHING:
			mHintTextView.setText(R.string.xlistview_header_hint_loading);
			break;
		default:
		}

		mState = state;
	}
    
	public void setVisiableHeight(int height) {
		if (height < 0)
			height = 0;
		LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) mContainer
				.getLayoutParams();
		lp.height = height;
		mContainer.setLayoutParams(lp);
	}

	public int getVisiableHeight() {
		return mContainer.getHeight();
	}

}

 接下来需要自定义自己的ListView继承与android本身的ListView,方便自己添加新的方法。

package com.dhsr.smartID.view;

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
import android.view.animation.DecelerateInterpolator;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.Scroller;
import android.widget.TextView;

import com.example.sirelinkscanapp.R;

/**
 * 自定义ListView
 * 
 * @author cyf
 * 
 */
public class XListView extends ListView implements OnScrollListener {

	private final String TAG = "XListView";
	private float mLastY = -1;
	private Scroller mScroller;
	// 滑动
	private OnScrollListener mScrollListener;

	// 为外界创建监听
	private IXListViewListener mListViewListener;

	// 刚才定义的自定义控件
	private XListViewHeader mHeaderView;

	private RelativeLayout mHeaderViewContent;
	private TextView mHeaderTimeView;
	private int mHeaderViewHeight; // header view's height
	private boolean mEnablePullRefresh = true;
	private boolean mPullRefreshing = false; // is refreashing.

	private boolean mEnablePullLoad;
	private boolean mPullLoading;
	private boolean mIsFooterReady = false;

	// total list items, used to detect is at the bottom of listview.
	private int mTotalItemCount;

	// for mScroller, scroll back from header or footer.
	private int mScrollBack;
	private final static int SCROLLBACK_HEADER = 0;
	private final static int SCROLLBACK_FOOTER = 1;

	private final static int SCROLL_DURATION = 400; // scroll back duration
	private final static int PULL_LOAD_MORE_DELTA = 50; // when pull up >= 50px
														// at bottom, trigger
														// load more.
	private final static float OFFSET_RADIO = 1.8f; // support iOS like pull
													// feature.

	/**
	 * @param context
	 */
	public XListView(Context context) {
		super(context);
		initWithContext(context);
	}

	public XListView(Context context, AttributeSet attrs) {
		super(context, attrs);
		initWithContext(context);
	}

	public XListView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		initWithContext(context);
	}

	/**
	 * 初始化控件
	 * 
	 * @param context
	 */
	private void initWithContext(Context context) {
		mScroller = new Scroller(context, new DecelerateInterpolator());

		super.setOnScrollListener(this);

		mHeaderView = new XListViewHeader(context);
		mHeaderViewContent = (RelativeLayout) mHeaderView
				.findViewById(R.id.xlistview_header_content);
		mHeaderTimeView = (TextView) mHeaderView
				.findViewById(R.id.xlistview_header_time);

		addHeaderView(mHeaderView, null, false);

		mHeaderView.getViewTreeObserver().addOnGlobalLayoutListener(
				new OnGlobalLayoutListener() {
					@Override
					public void onGlobalLayout() {
						mHeaderViewHeight = mHeaderViewContent.getHeight();
						getViewTreeObserver()
								.removeGlobalOnLayoutListener(this);
					}
				});
	}

	@Override
	public void setAdapter(ListAdapter adapter) {
		// make sure XListViewFooter is the last footer view, and only add once.
		if (mIsFooterReady == false) {
			if (mEnablePullLoad) {
				mIsFooterReady = true;
				// addFooterView(mFooterView);

			}
		}




 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Android—自定义控件实现ListView下拉刷新,androidlistview

相关文章

  • 2017-05-26MaterialRefreshLayout,swiperefreshlayout
  • 2017-05-26踩坑实录 Android studio中关于 No cached version of **** available for of处理办法,androidcached
  • 2017-05-26Android新手入门2016(11)--非阻塞对话框AlertDialog
  • 2017-05-26AndroidStudio项目提交(更新)到github最详细步骤
  • 2017-05-26golang错误处理之error
  • 2017-05-26xUtils3,xutils3github
  • 2017-05-26Linux动态链接库加载失败一例
  • 2017-05-26Android的Message Pool是什么——源码角度分析,androidpool
  • 2017-05-26解决Android后台清理APP后,程序自动重启的问题,androidapp
  • 2018-01-28揭开AssetBundle庐山真面目(二)

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • Android开发9:网络访问&amp;Web服务开发,android开发9访问
    • Android的系统体系结构,android体系结构
    • Android Studio混淆打包错误
    • Android View体系(九)自定义View
    • Android从网上下载图片
    • 关于JNI的使用方法,JNI使用方法
    • LinearLayout嵌套,linearlayout
    • Android 无标题 全屏设置,android无标题全屏
    • Android Studio插件,androidstudio插件
    • Android 手机卫士--参照文档编写选择器,android选择器

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有