前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android ListView等列表设置空布局

Android ListView等列表设置空布局

作者头像
全栈程序员站长
发布2022-09-15 11:34:19
7360
发布2022-09-15 11:34:19
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

在Android平台上,listView 是特别常用的组件之一,我们在向用户展示列表数据时,通常要考虑: 列表有数据和无数据空的状态,因为网络环境各异,难免刷新失败什么的;

在此之前我是使用ViewStub来实现,通过判断listview列表数据是否为空来设置ViewStub的隐藏和显示,或者设置lIstview的显示或隐藏;

但是,对ViewStub不是特别的了解,把控不好,只是控制其显示和隐藏,如果对其设置点击刷新数据等交互时,会遇到找不到id等报出NULL的异常;

今天忽然发现一个简单地方法,可以轻松搞定这个小需求.(android listview空布局刷新数据:列表无数据时显示数据加载失败的提示,并且点击提示,刷新数据);

我们来看一下ListView的继承关系,

代码语言:javascript
复制

ListView extends AbsListView

AbsListView extends AdapterView

这个AdapterView抽象类,有一个方法,我们可以很清楚地看到这个方法就是为在列表适配器为空时要显示的View;

Android系统已经为我们写好的方法,我们没有理由不用,也没有必要重复造轮子;拿来直接用

代码语言:javascript
复制
/**  * Sets the view to show if the adapter is empty  */ @android.view.RemotableViewMethod
public void setEmptyView(View emptyView) {
    mEmptyView = emptyView;

    // If not explicitly specified this view is important for accessibility.     if (emptyView != null             && emptyView.getImportantForAccessibility() == IMPORTANT_FOR_ACCESSIBILITY_AUTO) {
        emptyView.setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_YES);
    }

    final T adapter = getAdapter();
    final boolean empty = ((adapter == null) || adapter.isEmpty());
    updateEmptyStatus(empty);
}

很简单,我们来看一下Demod的代码片段简单地使用.

代码语言:javascript
复制
@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    listView = (ListView) findViewById(R.id.listview);    textView = (TextView) findViewById(R.id.textView);    listView.setEmptyView(textView);//添加引用    adapter = new MyAdapter();    listView.setAdapter(adapter);    textView.setOnClickListener(new View.OnClickListener() {        @Override        public void onClick(View v) {            if (adapter.getCount() == 0) {                adapter.setCount(1);                adapter.notifyDataSetChanged();            }        }    });}

就是这么简单;

再来看看布局,不论你的布局是不是FrameLayout,都可以做到.listview有数据要显示时,textview不显示.

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:orientation="horizontal"
    tools:context=".MainActivity">

    <ListView
        android:id="@+id/listview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:descendantFocusability="afterDescendants"
        android:visibility="gone"
        android:focusable="true" />

    <TextView
        android:id="@+id/textView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:text="没有数据哦,点我刷新"
        android:textColor="@android:color/background_dark"
        android:textSize="14dp"
        android:textStyle="bold"
        android:layout_gravity="center" />
</LinearLayout>
 后记:  
 空布局需要和listview放同一个布局, 这个点我们看源代码实现方法也是让他们交换显示的参数,而不是添加或者删除组件视图.
 小技巧,大用途.
 
 
                                                        发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/163291.html原文链接:https://javaforall.cn
		
			【正版授权,激活自己账号】:
			
			Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
			
		

		
			【官方授权 正版激活】:
			
			官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档