Android XListView实现原理讲解及分析

XListview是一个非常受欢迎的下拉刷新控件,但是已经停止维护了。之前写过一篇XListview的使用介绍,用起来非常简单,这两天放假无聊,研究了下XListview的实现原理,学到了很多,今天分享给大家。

提前声明,为了让代码更好的理解,我对代码进行了部分删减和重构,如果大家想看原版代码,请去github自行下载。

Xlistview项目主要是三部分:XlistView,XListViewHeader,XListViewFooter,分别是XListView主体、header、footer的实现。下面我们分开来介绍。

下面是修改之后的XListViewHeader代码

[java] view plaincopy

  1. public class XListViewHeader extends LinearLayout {
  2. private static final String HINT_NORMAL = "下拉刷新";
  3. private static final String HINT_READY = "松开刷新数据";
  4. private static final String HINT_LOADING = "正在加载...";
  5. // 正常状态
  6. public final static int STATE_NORMAL = 0;
  7. // 准备刷新状态,也就是箭头方向发生改变之后的状态
  8. public final static int STATE_READY = 1;
  9. // 刷新状态,箭头变成了progressBar
  10. public final static int STATE_REFRESHING = 2;
  11. // 布局容器,也就是根布局
  12. private LinearLayout container;
  13. // 箭头图片
  14. private ImageView mArrowImageView;
  15. // 刷新状态显示
  16. private ProgressBar mProgressBar;
  17. // 说明文本
  18. private TextView mHintTextView;
  19. // 记录当前的状态
  20. private int mState;
  21. // 用于改变箭头的方向的动画
  22. private Animation mRotateUpAnim;
  23. private Animation mRotateDownAnim;
  24. // 动画持续时间
  25. private final int ROTATE_ANIM_DURATION = 180;
  26. public XListViewHeader(Context context) {
  27. super(context);
  28. initView(context);
  29. }
  30. public XListViewHeader(Context context, AttributeSet attrs) {
  31. super(context, attrs);
  32. initView(context);
  33. }
  34. private void initView(Context context) {
  35. mState = STATE_NORMAL;
  36. // 初始情况下,设置下拉刷新view高度为0
  37. LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
  38. LayoutParams.MATCH_PARENT, 0);
  39. container = (LinearLayout) LayoutInflater.from(context)www.qinlinyule.cn .inflate(
  40. R.layout.xlistview_header, null);
  41. addView(container, lp);
  42. // 初始化控件
  43. mArrowImageView = (ImageView) findViewById(R.id.xlistview_header_arrow);
  44. mHintTextView = (TextView) findViewById(R.id.xlistview_header_hint_textview);
  45. mProgressBar = (ProgressBar) findViewById(R.id.xlistview_header_progressbar);
  46. // 初始化动画
  47. mRotateUpAnim = new RotateAnimation(0.0f, -180.0f,
  48. Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
  49. 0.5f);
  50. mRotateUpAnim.setDuration(ROTATE_ANIM_DURATION);
  51. mRotateUpAnim.setFillAfter(true);
  52. mRotateDownAnim = new RotateAnimation(-180.0f, 0.0f,
  53. Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
  54. 0.5f);
  55. mRotateDownAnim.setDuration(ROTATE_www.thd178.com/ ANIM_DURATION);
  56. mRotateDownAnim.setFillAfter(true);
  57. }
  58. // 设置header的状态
  59. public void setState(int state) {
  60. if (state == mState)
  61. return;
  62. // 显示进度
  63. if (state == STATE_REFRESHING) www.taohuayuan178.com{
  64. mArrowImageView.clearAnimation(www.feifanyule.cn);
  65. mArrowImageView.setVisibility(View.INVISIBLE);
  66. mProgressBar.setVisibility(www.120xh.cn  View.VISIBLE);
  67. } else {
  68. // 显示箭头
  69. mArrowImageView.setVisibility(View.VISIBLE);
  70. mProgressBar.setVisibility(View.www.vboyule66.cn/ INVISIBLE);
  71. }
  72. switch (state) {
  73. case STATE_NORMAL:
  74. if (mState == STATE_READY) {
  75. mArrowImageView.startAnimation(mRotateDownAnim);
  76. }
  77. if (mState == STATE_REFRESHING) {
  78. mArrowImageView.clearAnimation();
  79. }
  80. mHintTextView.setText(HINT_NORMAL);
  81. break;
  82. case STATE_READY:
  83. if (mState != STATE_READY) {
  84. mArrowImageView.clearAnimation();
  85. mArrowImageView.startAnimation(mRotateUpAnim);
  86. mHintTextView.setText(HINT_READY);
  87. }
  88. break;
  89. case STATE_REFRESHING:
  90. mHintTextView.setText(HINT_LOADING);
  91. break;
  92. }
  93. mState = state;
  94. }
  95. public void setVisiableHeight(int height) {
  96. if (height < 0)
  97. height = 0;
  98. LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) container
  99. .getLayoutParams();
  100. lp.height = height;
  101. container.setLayoutParams(lp);
  102. }
  103. public int getVisiableHeight() {
  104. return container.getHeight();
  105. }
  106. public void show() {
  107. container.setVisibility(View.VISIBLE);
  108. }
  109. public void hide() {
  110. container.setVisibility(View.INVISIBLE);
  111. }
  112. }

XListViewHeader继承自linearLayout,用来实现下拉刷新时的界面展示,可以分为三种状态:正常、准备刷新、正在加载。

在Linearlayout布局里面,主要有指示箭头、说明文本、圆形加载条三个控件。在构造函数中,调用了initView()进行控件的初始化操作。在添加布局文件的时候,指定高度为0,这是为了隐藏header,然后初始化动画,是为了完成箭头的旋转动作。

setState()是设置header的状态,因为header需要根据不同的状态,完成控件隐藏、显示、改变文字等操作,这个方法主要是在XListView里面调用。除此之外,还有setVisiableHeight()和getVisiableHeight(),这两个方法是为了设置和获取Header中根布局文件的高度属性,从而完成拉伸和收缩的效果,而show()和hide()则显然就是完成显示和隐藏的效果。

下面是Header的布局文件

[html] view plaincopy

    1. <?xml version="1.0" encoding="utf-8"?>
    2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    3. xmlns:tools="http://schemas.android.com/tools"
    4. android:layout_width="match_parent"
    5. android:layout_height="wrap_content"
    6. android:gravity="bottom" >
    7. <RelativeLayout
    8. android:id="@+id/xlistview_header_content"
    9. android:layout_width="match_parent"
    10. android:layout_height="60dp"
    11. tools:ignore="UselessParent" >
    12. <TextView
    13. android:id="@+id/xlistview_header_hint_textview"
    14. android:layout_width="100dp"
    15. android:layout_height="wrap_content"
    16. android:layout_centerInParent="true"
    17. android:gravity="center"
    18. android:text="正在加载"
    19. android:textColor="@android:color/black"
    20. android:textSize="14sp" />
    21. <ImageView
    22. android:id="@+id/xlistview_header_arrow"
    23. android:layout_width="30dp"
    24. android:layout_height="wrap_content"
    25. android:layout_centerVertical="true"
    26. android:layout_toLeftOf="@id/xlistview_header_hint_textview"
    27. android:src="@drawable/xlistview_arrow" />
    28. <ProgressBar
    29. android:id="@+id/xlistview_header_progressbar"
    30. style="@style/progressbar_style"
    31. android:layout_width="30dp"
    32. android:layout_height="30dp"
    33. android:layout_centerVertical="true"
    34. android:layout_toLeftOf="@id/xlistview_header_hint_textview"
    35. android:visibility="invisible" />
    36. </RelativeLayout>
    37. </LinearLayout>

原文地址:https://www.cnblogs.com/qwangxiao/p/9080104.html

时间: 2024-10-17 16:46:14

Android XListView实现原理讲解及分析的相关文章

【Android界面实现】XListView实现原理讲解及分析

转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992 XListview是一个非常受欢迎的下拉刷新控件,但是已经停止维护了.之前写过一篇XListview的使用介绍,用起来非常简单,这两天放假无聊,研究了下XListview的实现原理,学到了很多,今天分享给大家. 提前声明,为了让代码更好的理解,我对代码进行了部分删减和重构,如果大家想看原版代码,请去github自行下载. Xlistview项目主要是三部分:XlistView,XListViewHeade

Android Touch事件原理加实例分析

Android中有各种各样的事件,以响应用户的操作.这些事件可以分为按键事件和触屏事件.而Touch事件是触屏事件的基础事件,在进行Android开发时经常会用到,所以非常有必要深入理解它的原理机制. Android Touch事件原理描述 一个最简单的屏幕触摸动作触发了一系列Touch事件:ACTION_DOWN->ACTION_MOVE->ACTION_MOVE->ACTION_MOVE...->ACTION_MOVE->ACTION_UP. 当屏幕中包含一个ViewGr

Android加壳原理分析

0x00 阅读本文前,建议读者首先阅读Android加壳原理,参考文章Android中的Apk的加固(加壳)原理解析和实现.如果没有看过这篇文章,本文理解起来比较困难. 0x01 下面我们来分析脱壳代码为什么要这样写,核心脱壳代码在ProxyApplication类里面,首先执行成员方法attachBaseContext,然后执行成员方法onCreate. 那么attachBaseContext是什么时候被执行的呢,为什么先于onCreate执行呢?那就需要看Android的源码了,我们选用的是

Android 应用开发性能优化完全分析

1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉大家你一总结.我一总结的都说到了很多优化注意事项,但是看过这些文章后大多数存在一个问题就是只给出啥啥啥不能用,啥啥啥该咋用等,却很少有较为系统的进行真正性能案例分析的,大多数都是嘴上喊喊或者死记住规则而已(当然了,这话我自己听着都有些刺耳,实在不好意思,其实关于性能优化的优质博文网上也还是有很多的,譬如Google官方都已经推出了优化专题,我这里只是总结下自的感悟而已,若有得罪欢迎拍砖,我

【转】Android应用开发性能优化完全分析

http://blog.csdn.net/yanbober/article/details/48394201 1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉大家你一总结.我一总结的都说到了很多优化注意事项,但是看过这些文章后大多数存在一个问题就是只给出啥啥啥不能用,啥啥啥该咋用等,却很少有较为系统的进行真正性能案例分析的,大多数都是嘴上喊喊或者死记住规则而已(当然了,这话我自己听着都有些刺耳,实在不好意思,其实关于性能优化的优质博文网

转——Android应用开发性能优化完全分析

[工匠若水 http://blog.csdn.net/yanbober 转载请注明出处.] 1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉大家你一总结.我一总结的都说到了很多优化注意事项,但是看过这些文章后大多数存在一个问题就是只给出啥啥啥不能用,啥啥啥该咋用等,却很少有较为系统的进行真正性能案例分析的,大多数都是嘴上喊喊或者死记住规则而已(当然了,这话我自己听着都有些刺耳,实在不好意思,其实关于性能优化的优质博文网上也还是有很多的,

转:Android应用开发性能优化完全分析

转自:http://blog.csdn.net/yanbober/article/details/48394201 1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉大家你一总结.我一总结的都说到了很多优化注意事项,但是看过这些文章后大多数存在一个问题就是只给出啥啥啥不能用,啥啥啥该咋用等,却很少有较为系统的进行真正性能案例分析的,大多数都是嘴上喊喊或者死记住规则而已(当然了,这话我自己听着都有些刺耳,实在不好意思,其实关于性能优化的优质

Android 上千实例源码分析以及开源分析

Android 上千实例源码分析以及开源分析(百度云分享) 要下载的直接翻到最后吧,项目实例有点多. 首先 介绍几本书籍(下载包中)吧. 01_Android系统概述 02_Android系统的开发综述 03_Android的Linux内核与驱动程序 04_Android的底层库和程序 05_Android的JAVA虚拟机和JAVA环境 06_Android的GUI系统 07_Android的Audio系统 08_Android的Video 输入输出系统 09_Android的多媒体系统 10_

Android插件化原理(一)Activity插件化

Android深入四大组件系列 Android解析AMS系列 Android解析ClassLoader系列 前言 四大组件的插件化是插件化技术的核心知识点,而Activity插件化更是重中之重,Activity插件化主要有三种实现方式,分别是反射实现.接口实现和Hook技术实现.反射实现会对性能有所影响,主流的插件化框架没有采用此方式,关于接口实现可以阅读dynamic-load-apk的源码,这里不做介绍,目前Hook技术实现是主流,因此本篇文章主要介绍Hook技术实现. Hook技术实现主要