最简单通用加载效果---完全实现自定义
来源:互联网 发布:个人怎样做网络销售 编辑:程序博客网 时间:2024/06/08 07:28
一.无图无真相
二.主要代码
1.简单布局
a.主布局 activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:layout_width="match_parent" android:layout_height="50dp" android:background="#ff0000" android:gravity="center" android:text="加载效果演示" android:textColor="#ffffff" android:textSize="18sp" /> <ListView android:id="@+id/listView1" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" > </ListView> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <Button android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:onClick="showLoadSuccess" android:text="加载成功" /> <Button android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:onClick="showLoadError" android:text="加载失败" /> <Button android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:onClick="showLoadEmpty" android:text="没有数据" /> </LinearLayout></LinearLayout>
b.加载中布局 load_loading.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:background="#5555" android:orientation="vertical" > <ProgressBar android:id="@+id/progressBar1" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="12dp" android:text="正在加载中..." /></LinearLayout>
c.加载失败和没有数据简单布局 load_empty.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#eee" android:gravity="center" android:orientation="vertical" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="暂无数据" /> <Button android:id="@+id/button1" android:layout_width="80dp" android:layout_height="40dp" android:layout_marginTop="12dp" android:text="点击重试" /></LinearLayout>
2.主要代码
a.定义接口 ViewCallBack
package com.gulang.commonloadview;import android.content.Context;import android.view.View;/** * 定义实现接口 * * @author 孤狼 * @since 2015-8-4 */public interface ViewCallBack { // 获取当前布局 public abstract View getCurrentLayout(); // 重置布局 public abstract void resetView(); // 显示布局 public abstract void showLayout(View view); public abstract void showLayout(int layoutId); // 填充布局 public abstract View inflate(int layoutId); public abstract Context getContext(); public abstract View getView();}
b(1).添加要加载的布局 ViewGroupLayout
package com.gulang.commonloadview;import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;/** * 添加布局 * 实现思想:获取要显示区域的父布局,添加要显示的布局,只需要在代码中控制显示即可 * @author 孤狼 * @since 2015-8-4 */public class ViewGroupLayout implements ViewCallBack { private View view; private ViewGroup parentView; private int viewIndex; private ViewGroup.LayoutParams params; private View currentView; public ViewGroupLayout(View view) { super(); this.view = view; } private void init() { params = view.getLayoutParams(); //获取要显示区域的父布局 if (view.getParent() != null) { parentView = (ViewGroup) view.getParent(); } else { parentView = (ViewGroup) view.getRootView().findViewById( android.R.id.content); } int count = parentView.getChildCount(); for (int index = 0; index < count; index++) { if (view == parentView.getChildAt(index)) { viewIndex = index; break; } } currentView = view; } @Override public View getCurrentLayout() { return currentView; } @Override public void resetView() { showLayout(view); } @Override public void showLayout(View view) { if (parentView == null) { init(); } this.currentView = view; // 判断替换 if (parentView.getChildAt(viewIndex) != view) { ViewGroup parent = (ViewGroup) view.getParent(); if (parent != null) { parent.removeView(view); } parentView.removeViewAt(viewIndex); parentView.addView(view, viewIndex, params); } } @Override public void showLayout(int layoutId) { showLayout(inflate(layoutId)); } @Override public View inflate(int layoutId) { return LayoutInflater.from(view.getContext()).inflate(layoutId, null); } @Override public Context getContext() { return view.getContext(); } @Override public View getView() { return view; }}
b(2).第二种方式,添加布局
package com.gulang.commonloadview;import android.content.Context;import android.view.View;import android.view.ViewGroup;import android.view.ViewGroup.LayoutParams;import android.widget.FrameLayout;/** * 添加布局界面 * * @author 孤狼 * @since 2015-8-4 */public class ViewFrameLayout implements ViewCallBack { private ViewCallBack helper; private View view; public ViewFrameLayout(View view) { super(); this.view = view; ViewGroup group = (ViewGroup) view.getParent(); LayoutParams layoutParams = view.getLayoutParams(); FrameLayout frameLayout = new FrameLayout(view.getContext()); group.removeView(view); group.addView(frameLayout, layoutParams); LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); View floatView = new View(view.getContext()); frameLayout.addView(view, params); frameLayout.addView(floatView, params); helper = new ViewGroupLayout(floatView); } @Override public View getCurrentLayout() { return helper.getCurrentLayout(); } @Override public void resetView() { helper.resetView(); } @Override public void showLayout(View view) { helper.showLayout(view); } @Override public void showLayout(int layoutId) { showLayout(inflate(layoutId)); } @Override public View inflate(int layoutId) { return helper.inflate(layoutId); } @Override public Context getContext() { return helper.getContext(); } @Override public View getView() { return view; }}
c.自定义显示工具类(可根据具体要求自己实现,此处简单实现)
package com.gulang.commonloadview;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.TextView;import com.gulang.app.R;/** * 自定义布局,随意替换 * * @author 孤狼 * @since 2015-8-4 */public class LoadViewHelper { private ViewCallBack helper; // 构造函数 public LoadViewHelper(View view) { this(new ViewGroupLayout(view)); } // 构造函数 public LoadViewHelper(ViewCallBack helper) { super(); this.helper = helper; } // 加载错误 public void showError(String errorText, String buttonText, OnClickListener onClickListener) { View layout = helper.inflate(R.layout.load_error); TextView textView = (TextView) layout.findViewById(R.id.textView1); textView.setText(errorText); Button button = (Button) layout.findViewById(R.id.button1); button.setText(buttonText); button.setOnClickListener(onClickListener); helper.showLayout(layout); } // 数据为空 public void showEmpty(String errorText, String buttonText, OnClickListener onClickListener) { View layout = helper.inflate(R.layout.load_empty); TextView textView = (TextView) layout.findViewById(R.id.textView1); textView.setText(errorText); Button button = (Button) layout.findViewById(R.id.button1); button.setText(buttonText); button.setOnClickListener(onClickListener); helper.showLayout(layout); } // 正在加载中 public void showLoading(String loadText) { View layout = helper.inflate(R.layout.load_loading); TextView textView = (TextView) layout.findViewById(R.id.textView1); textView.setText(loadText); helper.showLayout(layout); } public void restore() { helper.resetView(); }}
d.代码中调用MainActivity.java
package com.gulang.app;import java.util.ArrayList;import java.util.List;import java.util.Random;import android.app.Activity;import android.os.AsyncTask;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.ArrayAdapter;import android.widget.ListView;import com.gulang.commonloadview.LoadViewHelper;/** * 简单演示,具体逻辑请根据开发需求 * * @author 孤狼 * @since 2015-8-4 */public class MainActivity extends Activity { private ListView listView; private LoadDataTask task; private LoadViewHelper helper; private ArrayAdapter<String> adapter; private List<String> data = new ArrayList<String>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); listView = (ListView) findViewById(R.id.listView1); //创建要加载的效果,关联要显示的父布局 helper = new LoadViewHelper(listView); listView.setAdapter(adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, data)); task = new LoadDataTask(3); task.execute(); } @Override protected void onDestroy() { super.onDestroy(); if (task != null) { task.cancel(true); } } // 加载失败 public void showLoadError(View view) { if (task != null) { task.cancel(true); } task = new LoadDataTask(1); task.execute(); } // 数据为空 public void showLoadEmpty(View view) { if (task != null) { task.cancel(true); } task = new LoadDataTask(2); task.execute(); } // 加载成功 public void showLoadSuccess(View view) { if (task != null) { task.cancel(true); } task = new LoadDataTask(3); task.execute(); } private class LoadDataTask extends AsyncTask<Void, Void, List<String>> { private int type; public LoadDataTask(int type) { super(); this.type = type; } @Override protected void onPreExecute() { super.onPreExecute(); helper.showLoading("加载中..."); } @Override protected List<String> doInBackground(Void... params) { try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } if (type == 1) { return null; } else if (type == 2) { return new ArrayList<String>(0); } List<String> strings = new ArrayList<String>(); for (int i = 0; i < 50; i++) { strings.add("通用加载效果测试" + i); } return strings; } @Override protected void onPostExecute(List<String> result) { super.onPostExecute(result); if (result == null) { helper.showError("加载失败", "重试", new OnClickListener() { @Override public void onClick(View v) { task = new LoadDataTask(1); task.execute(); } }); } else if (result.isEmpty()) { helper.showEmpty("暂无数据", "重试", new OnClickListener() { @Override public void onClick(View v) { task = new LoadDataTask(2); task.execute(); } }); } else { data.clear(); data.addAll(result); helper.restore(); adapter.notifyDataSetChanged(); } } }}
三.说明
废话不多说,代码比较简单,完全实现具体的自定义布局只需要修改LoadViewHelper 中加载显示的view即可
四.源码下载
加载效果Demo
0 0
- 最简单通用加载效果---完全实现自定义
- Cocos RenderTexture 橡皮擦效果 自定义画笔 最简单、最清晰的完全攻略
- 实现圆形加载中效果自定义Dialog
- android 自定义view实现进度条加载效果
- 自定义view实现圆形加载效果
- 自定义ListView加载动画,实现不一样的加载效果
- 自定义简单实现滑动下拉刷新效果
- Android自定义控件简单实现ratingbar效果
- C#读取配置文件详解 完全自定义实现动态加载dll
- 完全封装简单的实现图片的圆形剪切效果
- 自定义通用System.Web.UI.IHierarchicalDataSource简单实现
- 自定义view实现阻尼效果的加载动画
- Ionic3 自定义组件实现图片懒加载效果
- 自定义View实现圆形百分比加载的效果
- 最简单的通用Makefile
- 最简单翻页效果
- js最简单的图片切换效果实现
- 使用CoreAnimation实现最简单的拖拽转盘效果
- Ubuntu下nginx的编译与安装
- 计算机网络面试题
- JSP中页面跳转response.sendRedirect()和request.getRequestDispatcher()的区别
- Codeforces 4B
- FreeBSD 下 MySQL 安装与基本维护
- 最简单通用加载效果---完全实现自定义
- POJ2139--Six Degrees of Cowvin Bacon
- PHP ${}
- HDU 5327 Olympiad
- 搜索 - hdu5289 Assignment
- 快速排序
- 轻量级触摸响应式滑块插件JQuery lightSlider
- 暑假-树状数组-A - 敌兵布阵
- java并发编程之Exchanger