ListView实现顶部和底部内容指示器的方法_Android

顶部指示器?
这是什么?
好吧,我承认这是我自己想出来的词,因为我不知道它有什么学名,究竟是什么呢?看下这个图就知道了。

这是我们的美工MM画的,偶的神呐,这虽然很漂亮,不过也让人头疼,这个箭头应该在滚到顶部的时候消失,滚下来的时候(即有条目隐藏的时候)才显示,类似的底部指示器也要有这样的效果。事实上默认的ListView和ScrollView都已经有了类似的效果,在顶部或底部还有更多内容时,会有部分渐变虚化的效果,不过美工已经设计了这样的效果,那么我们就来做吧。
出于省事的目的,本教程中的例子会基于上一篇教程来修改,主要是添加1个继承自ListView的类,以及修改布局定义文件。
ArrowListView控件的编写

package net.learningandroid.lib.view;

import net.learningandroid.lib.R;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.widget.ListView;

/**
 * 支持上下箭头的ListView
 *
 * <a class="referer" href="http://my.oschina.net/arthor" target="_blank">@author</a> Mr. Lu
 */
public class ArrowListView extends ListView {

  private final float scale = getContext().getResources().getDisplayMetrics().density;
  private float topArrowPadding;
  private float bottomArrowPadding;

  private static float DEFAULT_TOP_PADDING_DP = 2.0f;
  private static float DEFAULT_BOTTOM_PADDING_DP = 2.0f;

  public ArrowListView(Context context, AttributeSet attrs) {
    super(context, attrs);

    String strTopArrowPadding = attrs.getAttributeValue(null,
        "topArrowPadding");
    String strBottomArrowPadding = attrs.getAttributeValue(null,
        "bottomArrowPadding");

    topArrowPadding = convertDisplayUom(strTopArrowPadding,
        DEFAULT_TOP_PADDING_DP);
    bottomArrowPadding = convertDisplayUom(strBottomArrowPadding,
        DEFAULT_BOTTOM_PADDING_DP);

    Log.v("ArrowListView", String.valueOf(topArrowPadding));
  }

  /**
   * 单位转换
   */
  private float convertDisplayUom(String sour, float defaultValue) {
    try {
      if (sour.toLowerCase().endsWith("px")) {
        return Float.parseFloat(sour.toLowerCase().replace("px", ""));
      } else if (sour.toLowerCase().endsWith("dp")) {
        return Integer.parseInt(sour.toLowerCase().replace("dp",
            ""))
            * scale + 0.5f;
      }
    } catch (Exception e) {
    }

    return (defaultValue * scale + 0.5f);
  }

  /**
   * onDraw方法,根据ListView滚动位置绘出箭头.
   */
  @Override
  protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    Paint paint = new Paint();

    // 取得箭头的图片,此处是固定图片,其实上可以做成配置方式
    Bitmap topPic = ((BitmapDrawable) getResources().getDrawable(
        R.drawable.arrow_up)).getBitmap();
    Bitmap bottomPic = ((BitmapDrawable) getResources().getDrawable(
        R.drawable.arrow_down)).getBitmap();

    // 取得ListView的绘制区域大小
    Rect r = new Rect();
    this.getDrawingRect(r);

    // 计算箭头的绘制位置
    float top = r.top + topArrowPadding;
    float bottom = r.bottom - bottomArrowPadding - bottomPic.getHeight();
    float left = r.left + (r.right - r.left - topPic.getWidth()) / 2;

    // 计算是否需要绘制
    boolean drawTop = false;
    boolean drawBottom = false;

    if (this.getChildCount() > 0) {
      Rect rTop = new Rect();
      this.getChildAt(0).getLocalVisibleRect(rTop);
      Rect rBottom = new Rect();
      View lastChild = this.getChildAt(this.getChildCount() - 1);
      lastChild.getLocalVisibleRect(rBottom);

      drawTop = (this.getFirstVisiblePosition() > 0 || this
              .getFirstVisiblePosition() == 0
              && rTop.top > 0);
      drawBottom = (this.getLastVisiblePosition() < this.getAdapter()
              .getCount() - 1 || this.getLastVisiblePosition() == this
              .getAdapter().getCount() - 1
              && rBottom.bottom < lastChild.getHeight());
    }
    // 绘出箭头
    if (drawTop) {
      canvas.drawBitmap(topPic, left, top, paint);
    }

    if (drawBottom) {
      canvas.drawBitmap(bottomPic, left, bottom, paint);
    }
  }
}

就要点解释一下上面这段代码:
注意构造方法,我们必须继承public ArrowListView(Context context, AttributeSet attrs),这样才可以让这个类在xml定义文件中使用。
还要注意到,这里用了attrs.getAttributeValue来读取XML定义文件中的属性,其实有更好的方法,容我下次再讲解,这里先偷个懒。
convertDisplayUom方法是用来将dp转换成px的,可以看到由于我们用了getAttributeValue的方式,所以需要手动将String转成Float,很麻烦。
最后就是onDraw啦,计算出画箭头的位置,画出来就行了。
接下来就是布局文件的编写了

ArrowListView在XML文件中的使用

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent" android:layout_height="fill_parent"

  android:orientation="vertical"
  >
  <TextView
    android:text="Arrow List View Sample"
    android:layout_width="fill_parent" android:layout_height="wrap_content"

  />
  <net.learningandroid.lib.view.ArrowListView
    android:id="@+id/arrowListView"
    android:layout_width="fill_parent" android:layout_height="wrap_content"
    android:paddingTop="15dp" android:paddingBottom="20dp"

    android:layout_margin="10dp"
    android:background="@drawable/float_panel"
    android:layout_weight="1"
    android:cacheColorHint="#FFEDEDED" android:divider="#00EDEDED"

    topArrowPadding="5dp" bottomArrowPadding="10dp"
  />
</LinearLayout>

这里需要注意的是自定义控件和其中的属性的写法,不再是ListView了,而是你自己编写的控件类的类名。其它的内容就是定义padding,background,以及取消了分隔线的显示。
用这个布局文件替代上一篇教程中的布局文件,但Adapter的定义不变,因为ArrowListView是继承自ListView的,所以原先的Adapter的使用是一样的。

最后我们来看下效果:

如何?只需要小心的调整ListView的Padding和ArrowPadding的值就可以控制箭头出现的位置,如果需要控制更多,比如更换图片,或者当顶部无内容时让箭头变暗、有内容时变亮,都可以用同样的方法。
并且,如果修改了Attribute的读取方法之后,还可以通过xml文件来指定箭头的图片。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索ListView顶部
, ListView底部
ListView滚动到底部
listview滚动到底部、listview回到顶部、listview滚动到顶部、listview 滑动到顶部、listview底部分割线,以便于您获取更多的相关知识。

时间: 2024-10-06 04:23:17

ListView实现顶部和底部内容指示器的方法_Android的相关文章

ListView实现顶部和底部内容指示器的方法

顶部指示器? 这是什么? 好吧,我承认这是我自己想出来的词,因为我不知道它有什么学名,究竟是什么呢?看下这个图就知道了. 这是我们的美工MM画的,偶的神呐,这虽然很漂亮,不过也让人头疼,这个箭头应该在滚到顶部的时候消失,滚下来的时候(即有条目隐藏的时候)才显示,类似的底部指示器也要有这样的效果.事实上默认的ListView和ScrollView都已经有了类似的效果,在顶部或底部还有更多内容时,会有部分渐变虚化的效果,不过美工已经设计了这样的效果,那么我们就来做吧. 出于省事的目的,本教程中的例子

在ListView中实现顶部和底部内容指示器

http://www.open-open.com/lib/view/open1324995841233.html

Android ListView中动态显示和隐藏Header&amp;Footer的方法_Android

ListView的模板写法 ListView模板写法的完整代码: •android代码优化----ListView中自定义adapter的封装(ListView的模板写法) 以后每写一个ListView,就这么做:直接导入ViewHolder.java和ListViewAdapter,然后写一个自定义adapter继承自ListViewAdapter就行了. ListView中动态显示和隐藏Header&Footer 如果需要动态的显示和隐藏footer的话,按照惯例,误以为直接通过setVis

Android4.0平板开发之隐藏底部任务栏的方法_Android

本文实例讲述了Android4.0平板开发之隐藏底部任务栏的方法.分享给大家供大家参考,具体如下: 复制代码 代码如下: getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);//隐藏底部任务栏代码 上边已验证 下边百度过来的 showBar显示任务栏 closeBar隐藏任务栏 前提:需要ROOT权限 public static void showBar() { try { P

Android checkbox的listView(多选,全选,反选)具体实现方法_Android

布局文件:[html]  复制代码 代码如下: <?xml version="1.0" encoding="utf-8"?>  <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"      android:layout_width="fill_parent"      android:layout_height=

有一个jquery鼠标滚轮垂直滚动的代码 有什么办法可以当内容滚动到顶部或底部不移动鼠标继续滚动页面

问题描述 这个是鼠标滚轮拉动垂直滚动的代码问题是当垂直滚动的时候内容到顶部或底部就停止不继续滚动页面,现在想滚动页面,这个是main.js里的代码要修改哪一段就可以了?jQuery(function($){//-----------------------------------------------------------------------------------//Examples//--------------------------------------------------

Android滑动到顶部和底部时出现的阴影如何去掉_Android

android去掉滑动到顶部和底部的阴影 <ListView android:id="@+id/listView" android:layout_width="match_parent" android:layout_height="wrap_content" android:cacheColorHint="#00000000" android:divider="@color/line_color"

android-如何让一个布局文件在活动底部,不随着滚动,是顶部和底部不滚动,中间滚动

问题描述 如何让一个布局文件在活动底部,不随着滚动,是顶部和底部不滚动,中间滚动 如何让一个布局文件在活动底部,不随着滚动,是顶部和底部不滚动,中间滚动, 解决方案 在w3chool上有关css有这样的例子 解决方案二: AmazeUI滚动到底部或者滚动到顶部甚至任意位置ScrollView滚动到底部和顶部的检测 解决方案三: 中间的控件放到一个 ScrollView 中就可以了.: 解决方案四: 头尾固定,中间放可滚动的控件 解决方案五: 整个页面父布局改成 relativeLayout 里面

Android实现顶部底部双导航界面功能_Android

最近想弄一个双导航功能,查看了许多资料,总算是实现了功能,这边就算是给自己几个笔记吧!  先来看看效果  那么就开始实现了!  底部导航栏我选择用FragmentTabHost+Fragment来实现,这个方法我觉得挺好用的,代码量也不多  首先是开始的activity_main.xml  <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="htt