android loading 框架,Android通用LoadingView加载框架详解

本文介绍了如何手写一个包含加载中、显示数据、加载失败和空数据状态的自定义LoadingView框架,通过XML布局和代码实现动态切换视图。通过实例展示了在Activity中如何使用该组件进行不同状态的显示和错误处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

手写一个通用加载中、显示数据、加载失败、空数据的LoadingView框架。

1e1a48dd2fd83348aee566877bc3dfce.png

定义3个布局:加载中,加载失败,空数据

加载中:

加载失败:

空数据:

自定义一个LoadingView:

package com.sample.loadingview.widget;

import android.content.Context;

import android.content.res.TypedArray;

import android.support.annotation.AttrRes;

import android.support.annotation.NonNull;

import android.support.annotation.Nullable;

import android.util.AttributeSet;

import android.util.SparseArray;

import android.view.LayoutInflater;

import android.view.View;

import android.widget.FrameLayout;

import android.widget.ImageView;

import com.sample.loadingview.R;

public class LoadingView extends FrameLayout {

private int emptyLayoutId, errorLayoutId, loadingLayoutId;

private View contentView, emptyView, errorView, loadingView;

private LayoutInflater mInflater;

private SparseArrayviews = new SparseArray<>();

public LoadingView(@NonNull Context context) {

this(context, null);

}

public LoadingView(@NonNull Context context, @Nullable AttributeSet attrs) {

this(context, attrs, 0);

}

public LoadingView(@NonNull Context context, @Nullable AttributeSet attrs, @AttrRes int defStyleAttr) {

super(context, attrs, defStyleAttr);

TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.LoadLayout);

emptyLayoutId = a.getResourceId(R.styleable.LoadLayout_emptyView, R.layout.loading_empty);

errorLayoutId = a.getResourceId(R.styleable.LoadLayout_errorView, R.layout.loading_error);

loadingLayoutId = a.getResourceId(R.styleable.LoadLayout_loadingView, R.layout.loading_load);

mInflater = LayoutInflater.from(getContext());

a.recycle();

loadingView = mInflater.inflate(loadingLayoutId, null);

}

@Override

protected void onFinishInflate() {

super.onFinishInflate();

if (getChildCount() < 1) {

throw new RuntimeException("content view can not be null");

}

contentView = getChildAt(0);

if (loadingView.getVisibility() != GONE)

loadingView.setVisibility(GONE);

addView(loadingView);

views.put(loadingLayoutId, loadingView);

}

public void showError() {

errorView = views.get(errorLayoutId);

if (errorView == null) {

errorView = mInflater.inflate(errorLayoutId, null);

addView(errorView);

views.put(errorLayoutId, errorView);

final ImageView errorRetry = (ImageView) errorView.findViewById(R.id.error_retry);

errorRetry.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

if (mOnRetryClickListener != null)

mOnRetryClickListener.onClick(errorRetry);

}

});

}

if (errorView.getVisibility() != VISIBLE)

errorView.setVisibility(VISIBLE);

for (int i = 0, len = views.size(); i < len; i++) {

int key = views.keyAt(i);

if (key != errorLayoutId) {

View view = views.valueAt(i);

if (view != null)

if (view.getVisibility() != GONE)

view.setVisibility(GONE);

}

}

}

public void showEmpty() {

emptyView = views.get(emptyLayoutId);

if (emptyView == null) {

emptyView = mInflater.inflate(emptyLayoutId, null);

addView(emptyView);

views.put(emptyLayoutId, emptyView);

}

if (emptyView.getVisibility() != VISIBLE)

emptyView.setVisibility(VISIBLE);

for (int i = 0, len = views.size(); i < len; i++) {

int key = views.keyAt(i);

if (key != emptyLayoutId) {

View view = views.valueAt(i);

if (view != null)

if (view.getVisibility() != GONE)

view.setVisibility(GONE);

}

}

}

public void showLoading() {

loadingView = views.get(loadingLayoutId);

if (loadingView.getVisibility() != VISIBLE)

loadingView.setVisibility(VISIBLE);

for (int i = 0, len = views.size(); i < len; i++) {

int key = views.keyAt(i);

if (key != loadingLayoutId) {

View view = views.valueAt(i);

if (view != null)

if (view.getVisibility() != GONE)

view.setVisibility(GONE);

}

}

}

public void showContent() {

for (int i = 0, len = views.size(); i < len; i++) {

View view = views.valueAt(i);

if (view != null)

if (view.getVisibility() != GONE)

view.setVisibility(GONE);

}

}

private OnClickListener mOnRetryClickListener;

public void setOnRetryClickListener(OnClickListener onRetryClickListener) {

this.mOnRetryClickListener = onRetryClickListener;

}

}

定义attrs.xml

以上就这么些代码,接下来我们测试一下

Activity

package com.sample.loadingview;

import android.os.Bundle;

import android.support.v7.app.AppCompatActivity;

import android.view.View;

import android.widget.Button;

import android.widget.Toast;

import com.sample.loadingview.widget.LoadingView;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

private LoadingView loading_view;

private Button btn_loading;

private Button btn_content;

private Button btn_error;

private Button btn_empty;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

loading_view = (LoadingView) findViewById(R.id.loading_view);

btn_loading = (Button) findViewById(R.id.btn_loading);

btn_content = (Button) findViewById(R.id.btn_content);

btn_error = (Button) findViewById(R.id.btn_error);

btn_empty = (Button) findViewById(R.id.btn_empty);

//设置加载错误的点击事件

loading_view.setOnRetryClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

Toast.makeText(MainActivity.this, "重新加载", Toast.LENGTH_SHORT).show();

loading_view.showLoading();

}

});

btn_loading.setOnClickListener(this);

btn_content.setOnClickListener(this);

btn_error.setOnClickListener(this);

btn_empty.setOnClickListener(this);

}

@Override

public void onClick(View v) {

switch (v.getId()) {

case R.id.btn_loading:

loading_view.showLoading();//显示加载界面

break;

case R.id.btn_content:

loading_view.showContent();//显示内容界面

break;

case R.id.btn_error:

loading_view.showError();//显示错误界面

break;

case R.id.btn_empty:

loading_view.showEmpty();//显示空数据界面

break;

}

}

}

源码:下载地址

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

印染厂生产仓储信息系统 需求分析说明书 一. 系统背景 我国经济经历经多高速增长后,正处于崭新的发展阶段,人民生活水平普遍提高,国家不断加强环境保护和节能减排的政策力度。同时2008下半源自发达经济体的金融危机,愈演愈烈,已成为一场经济危机,并向全球蔓延。在这样的国际和国内经济背景下,我国经济发展面临着严峻考验,特别是以出口导向型劳动密集型产业面临的形势更为严峻:一方面劳动力、原材料、污水处理等成本上升,另一方面出口订单减少。在这种情况下,沿海某纺织印染集团公司的决策层经过分析和讨论,审时度势做出战略决策:与时俱进,调整和优化产品构,提高产品附加值、推行细化管理和集约化经营。 目前,根据集团的总体规划,将在印染分厂逐步建立一系列信息化系统,其中《生产仓储信息系统》,将实现原坯布和成品仓储管理信息化,达到细化、确化和高效化管理,达到最大限度降低仓储管理成本和提高仓储管理效率的目的。 本文将对《生产仓储信息系统》的实际需求进行分析,并制定出解决方案。 二. 系统目标 《生产仓储信息系统》主要实现以下目标:  实现坯布库存摆放和出入的信息化  实现灵活多样查询和统计  实现有效可靠的用户权限管理和系统的安全性 三. 业务描述 对纺织布匹进行印染加工是印染企业主要生产内容。布匹是印染厂的最主要生产物资,未经印染加工布匹被称为坯布(即纺织企业出厂产品),经过印染企业加工的布匹被称为成品布(即直接可在市场上销售的布匹)。 坯布进入印染厂后,首先存放在坯布仓库中,需要生产时,从坯布库中出库,供生产使用,本系统主要内容为坯布库的出入库管理和位置摆放管理。 (一) 坯布库管理  库存初始数据设置 在刚刚开始使用本系统时,可能仓库中已有一定的坯布,这时需要录入库存的初始量。库存初始信息包括: 规格、数量(米)、登记时间(月日),是否确定。 对初始信息可以设置、修改和确定。 一旦确定之后就不可以再进行设置和修改。  坯布出入库 坯布出入库即将坯布提出坯布库和进入坯布库。仓库管理人员对每一次出入库情况做详细记录,每天下班前结账结账以后的出入记录不可以再修改和变化,同时向上级部门报坯布库存日报表和日出入库明细清单。 出入库记录信息包含如下内容: 记录号、出入类型(出库、入库、盘盈、盘亏)、时间(月日)、客户、坯布厂家、规格、数量(米)、位置、登记人、登记时间(月日时分秒)、是否已结账结账人、结账时间(月日时分秒)、是否注销,注销人、注销时间。 坯布出入库管理主要包括: 新增入库,即新建一条坯布入库信息,记录内容 包括:记录号、时间(月日)、客户、坯布厂家、规格、数量(米)、位置、登记人、登记时间(月日时分秒) 修改出入库记录:对入库信息进行修改(记录号不可以修改),登记人和登记时间重新记录,结账以后的信息不可以修改。 注销出入库记录:对作废的、错误的出入库记录注销,表示不再使用,同时记录注销人和注销时间,结账以后的信息不可以注销。 结账:对选择日期当天的出入库记录进行结账,经结账记录加结账标志,同时记录结账人和结账日期。结账以后的信息不可以二次结账。 生成日报:依据当日结账出入库记录和上日存,生成当日库存日报,日报表样如下: 坯布库存日报表 部门:坯布库 报表人:XXX 日期:2009-6-28 规格 数量 上日存 日入库 日出库 日存 合计 生成日出入库明细:将当日结账出入库记录生成日出入库明细单,样表如下: 坯布日出入库明细单 部门:坯布库 报表人:XXX 日期:2009-6-28 记录号 规格 客户 坯布厂家 出入类型 数量 合计  坯布库存月报 坯布库存月报表 部门:坯布库 报表人:XXX 月份:2009-6 规格 数量 上月存 月入库 月出库 月存 合计  坯布库存报 坯布库存报表 部门:坯布库 报表人:XXX 份:2009 规格 数量 上入库 出库 存 合计  坯布库存盘点 库存盘点即对库存坯布进行实物清点,并进行帐实核对,并生成盘点报表。 在盘点之时,停止所有坯布出入库,未结帐的数据全部结账,生成盘点表: 坯布库存盘点表 部门:坯布库 盘点日期:2009-8-20 规格 账面库存量 实际数量 盈亏数量 盘点人 盘点表中需要填入的信息是实际数量、盈亏数量、盘点人。 根据盘点表生成盘点报表: 坯布库存盘点报表 部门:坯布库 盘点日期:2009-8-20 规格 账面库存量 实际数量 盈亏数量 最后应当盈亏入账,使帐实相符,具体在出入库记录中添加记录,出入类型为盘盈或者盘亏。  坯布库查询 可以按客户、规格、出入库日期、出/入库、位置、是否结账、是否注销、登记人等条件灵活地组合查询出入库记录。 (二) 系统的安全要求 本系统的用户及权限 管理员:能够进行系统的用户管理和维护,以及为用户分配权限。 其他用户:等够操作权限范围内的业务。 用户管理 任何用户必须经过权限分配和登录方可进入系统进行操作,任何用户操作都不能超越所拥有的权限。 密码维护 任何用户可以且仅能修改自己的密码 四. 系统功能划分 生产仓储信息系统将实现面向所有用户的统一操作平台,不同的业务功能,通过该平台实现统一登录统一管理,具有内在联系业务之间数据共享,尽可能避免重复操作。 (一) 安全子系统  用户管理 系统自带一个管理员用户,可以进行用户信息管理,负责对系统用户信息维护,及用户的权限分配。具体功能描述如下: 可以新建用户信息:用户ID、用户名称,密码由系统默认“123456”。 可以修改用户信息(不含密码)和删除用户信息,删除用户时同时删除该用户所拥有的权限。  用户登录 所用的系统用户,必须通过登录验证方可进入系统。如果用户不存在或者密码错误应当返回登录页面,并给用户相应提示。 未经登录的用户直接访问需要登录后才能访问的url时,系统应等够阻止。  用户登录后的操作菜单(首界面) 用户登录系统后所看到的操作菜单应为用户拥有的权限范围内的菜单。 (二) 基础信息子系统  客户信息维护 根据生产需要输入和维护必要的订单编号信息,内容为订单编号,客户名称等。  规格维护 根据生产需要录入和维护规格信息,内容为规格名称等。  位置代码维护 位置代码是指在物品所在仓库位置的编号,本功能即对位置代码进行定义和维护。 位置代码为5位编码,规则:仓库代号+区号+排号+列号,其含义如下: 仓库代号:R-坯布库 P-成品库 区号:00-99 排号:0-9 列号:0-9  坯布厂家维护 对坯布厂家信息进行录入和维护。  初始库存设置 可以对初始库存进行录入和修改,无误之后可以对初始库存进行确定,确定之后不再可以新增和更改。  盘点开关设置 进入本功能模块,在非盘点期间可以进行开始盘点操作,在盘点期间可以进行束盘点操作。 (三) 坯布库子系统  坯布出入库 非盘点期间 当日未结账之前,用户可以进行以下操作。 直接录入有关坯布出入库信息:出入类型(出库、入库、盘盈、盘亏)、客户、坯布厂家、规格、数量(米)、位置;系统自动生成记录号,并记录出入库日期、登记人姓名、登记人操作时间。 信息录入之后用户可以进行修改和注销和取消注销,但记录号不可以修改。 当日结账之后,仅可以查看出入库数据,不可以录入和修改、注销。 在盘点期间 不可以进行新增出入库信息,可以修改和注销现有未结帐信息,可以取消未结帐注销信息。  出入库结账 在非盘点期间 可以结账,即对选择某一日的出入记录进行扎结账之后不允许在已结账日期进行录入、修改、注销和结账操作,仅可以查看。 在该模块,用户可以生成当日库存日报。 在盘点期间 可以进行盘点结账,盘点结账之后不再可以修改、注销和取消注销。  坯布库存盘点 在盘点期间 用户可以生成盘点表,可以在盘点表中录入实际库存数量,可以提交保存,也可以修改。 如果盘点束或者盈亏已入账则不可以再录入和维护实际库存数量(即不可以修改盘点表)。 盘点束后 可以生成盘点报表。  坯布盈亏入账 用户可以将最近一次盘点盈亏数据入账,即以盘亏和盘盈的形式增加库存出入信息,这些信息来源于盘点表。 (四) 查询统计子系统  坯布库查询 可以按客户、规格、出入库日期、出/入库、位置、是否结账、是否注销、登记人等条件灵活地组合查询出入库记录。  坯布库存月报  坯布库存报 五. 系统环境 (一) 硬件环境  1)硬件平台 1、网络环境: 内部的局域网网速:局域网线路带宽为100M,工作站要求10M/100M,DB服务器为100M/1000M。 客户机(浏览器)外部接入网速不低于256kbps 2、服务器要求: DB服务器要求为高性能的PC服务器,配置最低要求(5个客户端):奔腾双核1.8GHz CPU,2G DDR2,160G HDD,100M/1000M NET,其他设备建议配备磁盘阵列备份与UPS电源。 WEB服务器要求为为高性能的PC服务器,配置最低要求:奔腾双核2.0GHz CPU,2G DDR,40G HDD,100M/1000M NET,其他设备建议配备磁盘阵列备份与UPS电源。 3、客户端要求: CPU频率在1.8GHZ/内存256M/硬盘20G以上的PC机,其中显示器建议可正常上1024×768分辨率。 (二) 软件平台  1)软件平台 服务器操作系统:WINDOWS XP/ WINDOWS 2000 Server 数据库系统:sqlserver 2005 JAVA平台:JDK1.5 J2EE1.4 WEB服务器: Tomcat 6.0 客户端操作系统: WINDOWS2000、WINDOWS XP 客户端浏览器:IE7.0或以上版本  2)系统开发工具 Eclipse 3.3+MyEclipse 6.5 + Tomcat6.0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值