本文共 4323 字,大约阅读时间需要 14 分钟。
在之前的开发过程中,遇到网络请求一般都会有展示网络请求状态的一些标识:“加载中”、“网络错误”、“内容为空”等。如果用户每次根据请求的状态都对这3种状态进行判断再确定显示与否又比较麻烦。当然,你可以将 其封装成方法放到Activity中,但是这样代码显示会比较臃肿。
自己尝试将网络请求的状态封装到一个自定义控件当中,其中基本上对每一种网络请求的结果都进行了封装,这样也省了不少事。
import android.content.Context;import android.text.TextUtils;import android.util.AttributeSet;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.RelativeLayout;import android.widget.TextView;import android.widget.Toast;import com.example.request.R;public class RequestView extends RelativeLayout { private LinearLayout noTaskLayout; private LinearLayout netFailLayout; private RelativeLayout loadingLayout; private TextView btnError; private ImageView emptyImg; private TextView emptyText; private int successTimes = 0; public RequestView(Context context) { this(context, null); } public RequestView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public RequestView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); inflate(context, R.layout.layout_request, this); init(); } private void init() { noTaskLayout = (LinearLayout) findViewById(R.id.ll_request_no_task); netFailLayout = (LinearLayout) findViewById(R.id.ll_request_net_fail); loadingLayout = (RelativeLayout) findViewById(R.id.rl_request_loading); btnError = (TextView) findViewById(R.id.error_btn); emptyImg = (ImageView) findViewById(R.id.iv_task_null); emptyText = (TextView) findViewById(R.id.tv_task_null); noTaskLayout.setVisibility(GONE); netFailLayout.setVisibility(GONE); loadingLayout.setVisibility(GONE); } /** * 加载成功 */ public void success() { successTimes++; noTaskLayout.setVisibility(GONE); netFailLayout.setVisibility(GONE); loadingLayout.setVisibility(GONE); } /** * 开始加载 */ public void startLoad() { loadingLayout.setVisibility(VISIBLE); } /** * 停止加载 */ public void stopLoad() { loadingLayout.setVisibility(GONE); } /** * 内容为空 */ public void empty() { noTaskLayout.setVisibility(VISIBLE); netFailLayout.setVisibility(GONE); loadingLayout.setVisibility(GONE); } /** * 网络错误 */ public void error() { if (successTimes < 1) { netFailLayout.setVisibility(VISIBLE); noTaskLayout.setVisibility(GONE); loadingLayout.setVisibility(GONE); } else { Toast.makeText(getContext(), "网络错误,请重试~", Toast.LENGTH_SHORT).show(); } } /** * 请求成功次数 * @return */ public int getSuccessTimes() { return successTimes; } /** * 设置结果为空默认图 * @param resId */ public void setEmptyImg(int resId) { emptyImg.setImageResource(resId); } /** * 设置列表为空提示信息 * @param text */ public void setEmptyText(String text) { if (!TextUtils.isEmpty(text)) { emptyText.setText(text); } } /** * 重新加载按钮显示文本 * @param msg */ public void setFixButtonMsg(String msg) { if (!TextUtils.isEmpty(msg)) { btnError.setText(msg); } } /** * 显示重新加载按钮 */ public void showFixButton() { btnError.setVisibility(VISIBLE); } /** * 不显示重新加载按钮 */ public void hideFixButton() { btnError.setVisibility(INVISIBLE); } public void showLoading() { loadingLayout.setVisibility(VISIBLE); } public void hideLoading() { loadingLayout.setVisibility(GONE); } public void showEmpty() { noTaskLayout.setVisibility(VISIBLE); } public void hideEmpty() { noTaskLayout.setVisibility(GONE); } public void showError() { netFailLayout.setVisibility(VISIBLE); } public void hideError() { netFailLayout.setVisibility(GONE); } public void setFixActionListener(OnClickListener listener) { if (listener != null) { btnError.setOnClickListener(listener); } }