大家好,又见面了,我是你们的朋友全栈君。
在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账号...