在Android平台上,listView 是特别常用的组件之一,我们在向用户展示列表数据时,通常要考虑: 列表有数据和无数据空的状态,因为网络环境各异,难免刷新失败什么的;
在此之前我是使用ViewStub来实现,通过判断listview列表数据是否为空来设置ViewStub的隐藏和显示,或者设置lIstview的显示或隐藏;
但是,对ViewStub不是特别的了解,把控不好,只是控制其显示和隐藏,如果对其设置点击刷新数据等交互时,会遇到找不到id等报出NULL的异常;
今天忽然发现一个简单地方法,可以轻松搞定这个小需求.(android listview空布局刷新数据:列表无数据时显示数据加载失败的提示,并且点击提示,刷新数据);
我们来看一下ListView的继承关系,
ListView extendsAbsListView
AbsListView extendsAdapterView
这个AdapterView抽象类,有一个方法,我们可以很清楚地看到这个方法就是为在列表适配器为空时要显示的View;
Android系统已经为我们写好的方法,我们没有理由不用,也没有必要重复造轮子;拿来直接用
/*** Sets the view to show if the adapter is empty*/@android.view.RemotableViewMethod
public voidsetEmptyView(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);
}
finalTadapter = getAdapter();
final booleanempty = ((adapter == null) || adapter.isEmpty());
updateEmptyStatus(empty);
}
很简单,我们来看一下Demod的代码片段简单地使用.
@Override
protected 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不显示.
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">
android:id="@+id/listview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:descendantFocusability="afterDescendants"
android:visibility="gone"
android:focusable="true" />
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" />
后记:
空布局需要和listview放同一个布局, 这个点我们看源代码实现方法也是让他们交换显示的参数,而不是添加或者删除组件视图.
小技巧,大用途.