欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android 自定义通用的loadingview实现代码

程序员文章站 2024-02-21 10:07:57
功能 1、显示加载视图,加载失败的时候显示加载失败视图,数据为空时显示数据为空视图,支持为失败视图设置点击事件重新加载数据。 2、支持个性化设置,自定义设置 加载、失败...

功能

1、显示加载视图,加载失败的时候显示加载失败视图,数据为空时显示数据为空视图,支持为失败视图设置点击事件重新加载数据。

2、支持个性化设置,自定义设置 加载、失败、空数据视图。

先放一张效果图压压惊

Android 自定义通用的loadingview实现代码

实现

实现思路其实就是一个framelayout里添加三个布局做处理显示隐藏,自定义视图其实就是替换里面的view ,代码比较简单,如果直接看过我的自定义view系列文章,或者对自定义view有所了解,都很容易看懂,所有直接上代码了。

具体代码

java 代码

public class commonloadingview extends framelayout {


  //加载时显示文字
  protected textview mloadingtexttv;
  public context mcontext;
  //加载错误视图
  protected linearlayout mloaderrorll;
  //加载错误点击事件处理
  private loadinghandler mloadinghandler;
  //加载view
  private view loadingview;
  //加载失败view
  private view loadingerrorview;
  //数据为空
  private view emptyview;


  public commonloadingview(context context, attributeset attrs) {
    this(context, attrs, 0);
  }

  public commonloadingview(context context, attributeset attrs, int defstyleattr) {
    super(context, attrs, defstyleattr);
    mcontext = context;
  }

  public void setloadinghandler(loadinghandler loadinghandler) {
    mloadinghandler = loadinghandler;
  }

  public void setloadingerrorview(view loadingerrorview) {
    this.removeviewat(1);
    this.loadingerrorview = loadingerrorview;
    this.loadingerrorview.setonclicklistener(new onclicklistener() {
      @override
      public void onclick(view v) {
        if (mloadinghandler != null) {
          mloadinghandler.dorequestdata();
          commonloadingview.this.load();
        }
      }
    });
    this.addview(loadingerrorview,1);
  }

  public void setloadingview(view loadingview) {
    this.removeviewat(0);
    this.loadingview = loadingview;
    this.addview(loadingview,0);
  }

  @override
  protected void onfinishinflate() {
    super.onfinishinflate();
    loadingview = inflate(mcontext, r.layout.common_loading_view, null);
    loadingerrorview = inflate(mcontext, r.layout.network_layout, null);
    emptyview = inflate(mcontext, r.layout.empty_layout, null);
    this.addview(loadingview);
    this.addview(loadingerrorview);
    this.addview(emptyview);
    loadingerrorview.setvisibility(gone);
    emptyview.setvisibility(gone);
    initview(this);
  }


  public void setmessage(string message) {
    mloadingtexttv.settext(message);
  }


  private void initview(view rootview) {
    mloadingtexttv = (textview) rootview.findviewbyid(r.id.loading_text_tv);
    mloaderrorll = (linearlayout) rootview.findviewbyid(r.id.load_error_ll);
    mloaderrorll.setonclicklistener(new onclicklistener() {
      @override
      public void onclick(view v) {
        if (mloadinghandler != null) {
          commonloadingview.this.load();
          mloadinghandler.dorequestdata();
        }
      }
    });
  }

  public void load(){
    loadingview.setvisibility(visible);
    loadingerrorview.setvisibility(gone);
    emptyview.setvisibility(gone);
  }

  public void load(string message){
    mloadingtexttv.settext(message);
    loadingview.setvisibility(visible);
    loadingerrorview.setvisibility(gone);
    emptyview.setvisibility(gone);
  }


  public void loadsuccess(){
    this.loadsuccess(false);
  }

  public void loadsuccess(boolean isempty){
    loadingview.setvisibility(gone);
    loadingerrorview.setvisibility(gone);
    if (isempty) {
      emptyview.setvisibility(visible);
    }else{
      emptyview.setvisibility(gone);
    }
  }


  public void loaderror(){
    loadingview.setvisibility(gone);
    loadingerrorview.setvisibility(visible);
  }


  public interface loadinghandler{
    void dorequestdata();
  }
}

使用

基本使用

几个基本的 load loaderror loadsucccess方法的使用。

public class defaultviewactivity extends appcompatactivity {

  protected listview mlistview;
  protected commonloadingview mloadingview;
  private list<string> mlist = new arraylist<>();
  arrayadapter adapter;


  @override
  protected void oncreate(bundle savedinstancestate) {
    super.oncreate(savedinstancestate);
    super.setcontentview(r.layout.activity_default_view);
    initview();
  }

  private void initview() {
    mlistview = (listview) findviewbyid(r.id.listview);
    mloadingview = (commonloadingview) findviewbyid(r.id.loadingview);
    mloadingview.load();

    //设置点击错误视图重新加载事件
    mloadingview.setloadinghandler(new commonloadingview.loadinghandler() {
      @override
      public void dorequestdata() {
        mloadingview.postdelayed(new runnable() {
          @override
          public void run() {
            for (int i = 1; i <=20 ; i++) {
              mlist.add(i+"");
            }
            adapter = new arrayadapter(defaultviewactivity.this, android.r.layout.simple_list_item_1, android.r.id.text1, mlist);
            mlistview.setadapter(adapter);
            mloadingview.loadsuccess(false);
          }
        },2500);
      }
    });

    //模拟网络错误,加载失败
    mloadingview.postdelayed(new runnable() {
      @override
      public void run() {
        mloadingview.loaderror();
      }
    },2500);


  }
}

自定义视图 使用

只需要把自己自定义的view调用set方法设置进去即可。

this.mloadingview.setloadingview(loadingview);
this.mloadingview.setloadingerrorview(loadingerrorview);
public class customviewactivity extends appcompatactivity {

  protected listview mlistview;
  protected commonloadingview mloadingview;
  private list<string> mlist = new arraylist<>();
  arrayadapter adapter;


  @override
  protected void oncreate(bundle savedinstancestate) {
    super.oncreate(savedinstancestate);
    super.setcontentview(r.layout.activity_default_view);
    initview();
  }

  private void initview() {
    mlistview = (listview) findviewbyid(r.id.listview);
    mloadingview = (commonloadingview) findviewbyid(r.id.loadingview);


    //设置自定义视图
    progressbar progressbar = new progressbar(this);
    this.mloadingview.setloadingview(progressbar);
    textview textview = new textview(this);
    textview.settext("加载失败...");
    this.mloadingview.setloadingerrorview(textview);

    mloadingview.load();

    //设置点击错误视图重新加载事件
    mloadingview.setloadinghandler(new commonloadingview.loadinghandler() {
      @override
      public void dorequestdata() {
        mloadingview.postdelayed(new runnable() {
          @override
          public void run() {
            for (int i = 1; i <=20 ; i++) {
              mlist.add(i+"");
            }
            adapter = new arrayadapter(customviewactivity.this, android.r.layout.simple_list_item_1, android.r.id.text1, mlist);
            mlistview.setadapter(adapter);
            mloadingview.loadsuccess(false);
          }
        },2500);
      }
    });

    //模拟网络错误,加载失败
    mloadingview.postdelayed(new runnable() {
      @override
      public void run() {
        mloadingview.loaderror();
      }
    },2500);
  }
}

至于具体的布局和样式文件就不贴了,主要是实现思路,代码

下载请参考源码下载

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。