RecyclerView 暂无数据 点击重新加载(一)

开发过程中往往会有 列表没有数据就显示 暂无数据点击刷新的需求
image.png
局部刷新可以参考RecyclerView 暂无数据 点击重新加载 (二)
image.png

可能大家会用一个RelativeLayout写套一个listview 以及一个暂无数据的ui 有数据显示就把暂无数据这个样式隐藏 如果这种页面多了 复制粘贴也是很烦的一件事情 今天就写一个简单的例子用自定义下RecyclerView 实现
直接继承 RecyclerView 重写onDraw方法
根据ui的效果要处理三个事情 第一个加载图片的绘制 以及文字的绘制
先第一步画一个图片也就是 前提条件得判断好getChildCount的数量 只有满足为0的时候才代表数据没有 才进行绘制 重新加载的样式
Canvas.drawBitmap方法
准备好一张图片

public void setBitmap(Bitmap bitmap) {
        this.bitmap = bitmap;
    }

算出绘制的坐标
image.png

注意的是 我这里是图片居中的效果 需要拿到RecyclerView的整体的宽高度减去图片的宽高除2 就能得到了中心点了

第一步图片完成了 就执行第二部 绘制文字
Canvas.drawText方法
位置于图片的下方
image.png
注意的是 Paint 得设置好字体大小样式等
image.png
setTextSize这个方法传入得px 而textview得textsize是sp 想要达到textview同样得大小需要吧sp转成px

public static int sp2px(Context context, float spValue) {
        final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
        return (int) (spValue * fontScale + 0.5f);
    }

这样就可以展示了 先看下效果
image.png
ps.没有图片就拿随便找了个图
 为了更好的逻辑 我们需要设定一个数据加载完了的标示 满足这个条件才去绘制我们的样式
image.png
最好一步就是去处理点击事件
重写dispatchTouchEvent 并在手指离开屏幕进行接口回调
image.png
只要实现并传递接口就完工了


public class MyRecyclerView extends RecyclerView {
    Shuaxin shuaxin; //自己瞎写的接口
    boolean complete;
    Bitmap bitmap;
    Paint paint;
    public MyRecyclerView(@NonNull Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        paint = new Paint();
        paint.setTextSize(DisplayUtils.sp2px(context,14));
        paint.setTextAlign(Paint.Align.CENTER);
        paint.setColor(Color.BLACK);
    }

    public void setShuaxin(Shuaxin shuaxin) {
        this.shuaxin = shuaxin;
    }

    public void setBitmap(Bitmap bitmap) {
        this.bitmap = bitmap;
    }
    //activity 告诉 recycleview 数据全给你了你自己看着办
    public void  completeLoad(){
        complete =true;
        invalidate(); //重绘 
    }

    @Override
    public void onDraw(Canvas c) {
        Log.d("RecyclerView","onDraw");
        if(getChildCount()==0 && complete){
            c.drawColor(Color.GREEN);
            int x = (getWidth()-bitmap.getWidth()) /2;
            int y = (getHeight()-bitmap.getHeight()) /2;
            c.drawBitmap(bitmap,x,y,paint);
            c.drawText("暂无数据点击重新加载",getWidth()/2,
                    (getHeight()/2)+bitmap.getHeight(),paint);


        }
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {

        switch (ev.getAction()){

            case    MotionEvent.ACTION_UP :
                if(getChildCount()==0&&this.shuaxin!=null){
                        shuaxin.shuaxin();

                   return true;
                }

        }
        return super.dispatchTouchEvent(ev);
    }
}

activity使用

image.png

到此就结束

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值