[Android]ListView的setEmptyView的替代方法

本文详细介绍了如何在ListView内容为空时显示自定义的‘内容为空’提示,包括使用setEmptyView方法的通用实现及自定义ListView的重绘方法,并提供了XML布局和代码示例。
当ListView内容为空时,我们显示一个“内容为空”的提示,用setEmptyView,如下:
<LinearLayout android:id="@+id/content"
    android:orientation="vertical"
    android:gravity="center_horizontal"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background="#FF000000">

    ......

    <ListView android:id="@+id/list_result"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:fastScrollEnabled="true" />

    <TextView android:id="@+id/list_empty"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:gravity="center"
        android:text="@string/TAG_NO_RESULT_CONTENT"
        android:textSize="16sp"
        android:textColor="#FF808080"
        android:padding="5dp"
        android:visibility="gone" />

</LinearLayout>

在代码里面使用如下调用:
list = (ListView)findViewById( R.id.list_result );

list.setEmptyView( findViewById( R.id.list_empty ) );

以上的是最通用的实现,我原来的实现是继承ListView,进行重绘,如下:
package com.xxxx.yyyy;

import android.text.TextPaint;

import android.util.AttributeSet;

import android.content.Context;

import android.graphics.Canvas;

import android.widget.ListView;

public class EmptyListView extends ListView
{
    private final TextPaint paint;

    public EmptyListView( Context context ){ this( context, null ); }

    public EmptyListView( Context context, AttributeSet attrs ){ this( context, attrs, android.R.attr.listViewStyle ); }

    public EmptyListView( Context context, AttributeSet attrs, int defStyle )
    {
        super( context, attrs, defStyle );

        this.paint = new TextPaint();

        this.paint.setColor( Color.GRAY );

        this.paint.setTextSize( getFontSize( context, 16 ) );

        this.paint.setAntiAlias( true );

        this.paint.setTextAlign( Align.CENTER );
    }

    @Override public void onMeasure( int widthMeasureSpec, int heightMeasureSpec )
    {
        super.onMeasure( widthMeasureSpec, heightMeasureSpec );
    }

    @Override public void onDraw( Canvas canvas )
    {
        super.onDraw( canvas );

        if( canvas == null || getCount() > 0 ){ return; }

        Object empty = super.getTag(); if( empty == null ){ return; }

        int offsetX = getWidth() / 2, offsetY = getHeight() / 2;

        canvas.translate( offsetX, offsetY );

        new StaticLayout( string, paint, getWidth() - 10/*padding*/, Alignment.ALIGN_NORMAL, 1.0F, 0.0F, true ).draw( canvas );

        canvas.translate( - offsetX, - offsetY );
    }

    private float getFontSize( Context context, float value )
    {
        if( context == null ){ return value; }

        Resources resources = context.getResources();

        if( resources == null ){ return value; }

        DisplayMetrics metrics = resources.getDisplayMetrics();

        if( metrics == null ){ return value; }

        return value * metrics.density;
    }
}

在XML中需要给ListView指定Tag,我们把需要显示的字符串放在Tag里,在绘制时取出来:
<LinearLayout android:id="@+id/content"
    android:orientation="vertical"
    android:gravity="center_horizontal"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background="#FF000000">

    ......

    <com.xxxx.yyyy.EmptyListView android:id="@+id/list_result"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:tag="This is an example"
        android:fastScrollEnabled="true" />

</LinearLayout>

其实,我开始使用的这个方法,后来由于扩展性差,就还是用了推荐的方法。
高级表格升级记录 By:邓学彬 2020/07=====================================[属性修改]01.增加属性:点燃边框色,让焦点单元格的文字颜色、边框颜色分开设置02.增加属性:表头,打开表头设计器,可视化设计表头=====================================[组件增加]增加可以放置到单元格里面的组件01.表格按钮02.表格选择按钮03.表格单选按钮04.表格开关按钮05.表格进度条=====================================[命令修改]01.高级表格.置列类型,增加 #表格常量.组件型02.高级表格.置列类型,增加 #表格常量.宽文本型03.高级表格.置数据,增加 组件型 数据的设置04.高级表格.置数据,增加 日期时间型 数据的处理05.高级表格.置数据,增加 宽文本(Unicode) 数据的处理06.高级表格.置日期格式,增加:#表格常量.日期时间格式1(yyyy-MM-dd HH:mm)07.高级表格.置日期格式,增加:#表格常量.日期时间格式2(yyyy-MM-dd HH:mm:ss)08.高级表格.置日期格式,增加:#表格常量.时间格式1(HH:mm)09.高级表格.置日期格式,增加:#表格常量.时间格式2(HH:mm:ss)10.高级表格.清空数据,增加参数:保留表头11.增加命令:高级表格.置组件,和“置数据”相似,一个单元格可以设置多个组件12.增加命令:高级表格.置按钮选中13.增加命令:高级表格.取按钮选中14.增加命令:高级表格.置进度条位置15.增加命令:高级表格.取进度条位置16.增加命令:高级表格.取宽文本数据17.增加命令:高级表格.取文本数据,和“取数据”相似,避免返回通用型出现的数据类型不一致问题。18.增加命令:高级表格.取逻辑数据19.增加命令:高级表格.取图片数据20.增加命令:高级表格.存到字节集,将表格中所有现有数据保存到字节集中。21.增加命令:高级表格.从字节集读,从字节集中读入表格数据22.增加命令:高级表格.自动调整行,根据内容长度、字体大小调整行高23.增加命令:高级表格.自动调整列,根据内容长度、字体大小调整列宽24.增加命令:高级表格.自动调整行列,根据内容长度、字体大小调整行高、列宽25.增加命令:高级表格.自动调整表头,根据表头设置的宽度为-1的列,平均分配列宽,铺满表格。26.增加命令:高级表格.分配列宽,其他列剩下的宽度,平均分给指定的列,铺满表格。=====================================[事件修改]01.增加事件:按钮被点击,单元格里的按钮、选择按钮被点击时触发02.增加事件:横向滚动条被改变03.增加事件:纵向滚动条被改变04.增加事件:滚动到底部,滚动条或鼠标滚轮滚动到底部时触发。=====================================[其他修改]01.修复在某些情况下,TAB键切换单元格失效的问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值