大家好,又见面了,我是你们的朋友全栈君。
在Android平台上,listView 是特别常用的组件之一,我们在向用户展示列表数据时,通常要考虑: 列表有数据和无数据空的状态,因为网络环境各异,难免刷新失败什么的;
在此之前我是使用ViewStub来实现,通过判断listview列表数据是否为空来设置ViewStub的隐藏和显示,或者设置lIstview的显示或隐藏;
但是,对ViewStub不是特别的了解,把控不好,只是控制其显示和隐藏,如果对其设置点击刷新数据等交互时,会遇到找不到id等报出NULL的异常;
今天忽然发现一个简单地方法,可以轻松搞定这个小需求.(android listview空布局刷新数据:列表无数据时显示数据加载失败的提示,并且点击提示,刷新数据);
我们来看一下ListView的继承关系,
ListView extends AbsListView
AbsListView extends AdapterView
这个AdapterView抽象类,有一个方法,我们可以很清楚地看到这个方法就是为在列表适配器为空时要显示的View;
Android系统已经为我们写好的方法,我们没有理由不用,也没有必要重复造轮子;拿来直接用
/** * 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的代码片段简单地使用.
@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不显示.
<?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放同一个布局, 这个点我们看源代码实现方法也是让他们交换显示的参数,而不是添加或者删除组件视图.
小技巧,大用途.
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/163291.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...