使用场景

  • 学生写课设没有太多时间写代码了,着急交

  • 公司里adapter被多层封装过了,被多处引用,再加接口,工作强度大。重新自定义的 adapter或者使用其他的adapter框架,可能会与公司风格不一致或者其他问题。

如果符合这两个场景,可以使用本文的思路。如果时间充足,代码工作强度不是很大,为了提升自己的技术能力,还是建议设置空视图写在 adapter 里,框架的话推荐 BaseQuickAdapter。

BaseQuickAdapter 中有 setEmptyView() 方法:

View inflate = View.inflate(getActivity(), R.layout.item_car_empty_view, null);
inflate.findViewById(R.id.tv_data).setOnClickListener(v -> {
    AppManager.getAppManager().finishOthersActivity(HomeActivity.class);
});
carAdapter.setEmptyView(inflate);

思路

空数据图片用 Imageview 显示,然后根据 RecyclerView 的数据量控制显示隐藏。因为用了SmartRefreshLayout 刷新框架,所以 Imageview 的显示隐藏就写在 SmartRefreshLayout 的两个获取数据的监听事件中 --- 刷新监听 setOnRefreshListener、加载监听 setOnLoadMoreListener。

实现

1 xml布局

用 RelativeLayout 把 Imageview 、RecyclerView 包在一起,Imageview 水平居中。

Imageview 初始设置为不显示,visibility="gone"。

<com.scwang.smartrefresh.layout.SmartRefreshLayout 
    android:id="@+id/srl_sales_data_refresh"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:srlAccentColor="@color/tab_select_color"
    app:srlPrimaryColor="@color/white">
    
	<com.scwang.smartrefresh.header.BezierCircleHeader
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
    
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        
        <android.support.v7.widget.RecyclerView
            android:id="@+id/rv_sales_data_list"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@color/white" />
        
        <ImageView
            android:visibility="gone"
            android:id="@+id/iv_empty_data"
            android:layout_marginTop="@dimen/dp_15"
            android:layout_centerHorizontal="true"
            android:src="@mipmap/ic_empty_data"
            android:layout_width="@dimen/dp_120"
            android:layout_height="@dimen/dp_120"/>
        
	</RelativeLayout>
    
</com.scwang.smartrefresh.layout.SmartRefreshLayout>

2 Activity

在SmartRefreshLayout 的两个监听事件中 --- 刷新监听setOnRefreshListener、加载监听setOnLoadMoreListener,获取 RecyclerView 的数据,根据数据量和页数控制 Imageview 的显示隐藏。

// SmartRefreshLayout 下拉刷新和上拉加载
refreshLayout.setEnableLoadMore(true);
// 下拉刷新,一直都是第一页
refreshLayout.setOnRefreshListener(refreshLayout -> {
    page = 1;
    // Imageview 在第一页初始设置为隐藏,有数据了再显示
    iv_empty_data.setVisibility(View.GONE);
    // 获取数据
    mPresenter.listInStockData();
});
// 上拉加载
refreshLayout.setOnLoadMoreListener(refreshLayout -> {
    page++;
    mPresenter.listInStockData();
});
// 数据获取成功后的回调
@Override
public void onGetSuccess(ArrayList<InStockDataBean> stockDataBeans) {
    if (page == 1) {
        //当是第一页的时候,如果数据为空的,就清空列表数据
        if (stockDataBeans == null) {
            stockDataBeans = new ArrayList<>();
        }
        if (stockDataBeans !=null && stockDataBeans.size() == 0) {
            // 第一页空数据时显示图片
            iv_empty_data.setVisibility(View.VISIBLE);
        }
        adapter.setData(stockDataBeans);
    } else if (page > 1) {
        //如果页数大于第一页,如果数据为空,就不处理,并且页数减一
        if (stockDataBeans == null || stockDataBeans.size() < 1) {
            page--;
            showToast("没有更多数据了!");
            return;
        }
        adapter.addData(stockDataBeans);
    }
}

3 效果

无数据时

下拉刷新时

有数据时

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐