Android之科普APP框架

    xiaoxiao2025-06-12  16

    Android之科普APP框架 科普APP源码下载 运行效果如下; 主要是通过ActionBar+viewpagerindicator来实现的。需要我们引入 android-support-v7-appcompat的jar包。前面的逻辑应该可以看懂。   还有一点是当打开应用后,会出现一个加载数据的进度条,如果加载出数据就让它显示数据,如果加载失败,就显示加载失败的图像。 <span style="font-size:18px;">package com.saiermeng.kepu.ui.fragment; import java.util.List; import android.content.Context; import android.os.SystemClock; import android.util.AttributeSet; import android.view.View; import android.widget.Button; import android.widget.FrameLayout; import com.saiermeng.kepu.R; import com.saiermeng.kepu.util.CommonUtil; /** * 管理界面加载的功能,根据不同的state显示对应的VIew * @author Administrator * */ public abstract class ContentPage extends FrameLayout{ //生成父类的构造方法:alt+shift+s->c public ContentPage(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); initContentPage(); } public ContentPage(Context context, AttributeSet attrs) { super(context, attrs); initContentPage(); } public ContentPage(Context context) { super(context); initContentPage(); } //定义4种状态常量 enum PageState{ STATE_LOADING(0),//加载中的状态 STATE_SUCCESS(1),//加载成功的状态 STATE_ERROR(2),//加载失败的状态 STATE_EMPTY(3);//加载数据为空的状态 private int value; PageState(int value){ this.value = value; } public int getValue(){ return value; } } //每个界面的默认状态是加载中 private PageState mState = PageState.STATE_LOADING; private View loadingView;//加载中的View private View errorView;//加载失败的View private View emptyView;//加载数据为空的View private View successView;//加载成功的View /** * 初始化COntentPage */ private void initContentPage(){ //1.往ContentPage中添加4个状态对应的View LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT); if(loadingView==null){ loadingView = View.inflate(getContext(), R.layout.page_loading, null); } addView(loadingView,params); if(errorView==null){ errorView = View.inflate(getContext(), R.layout.page_error, null); Button btn_reload = (Button) errorView.findViewById(R.id.btn_reload); btn_reload.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //1.先重置为loading状态, mState = PageState.STATE_LOADING; showPage(); //2.重新加载数据,然后刷新page loadDataAndRefreshPage(); } }); } addView(errorView,params); if(emptyView==null){ emptyView = View.inflate(getContext(), R.layout.page_empty, null); } addView(emptyView,params); //添加成功的View if(successView==null){ successView = createSuccessView(); } if(successView!=null){ addView(successView,params); }else { throw new IllegalArgumentException("The method createSuccessView() can not return null!"); } //2.根据当前state,显示对应的View showPage(); //3.然后加载数据,并刷新VIew loadDataAndRefreshPage(); } /** * 根据对应的state显示对应的View */ private void showPage(){ loadingView.setVisibility(View.INVISIBLE); successView.setVisibility(View.INVISIBLE); errorView.setVisibility(View.INVISIBLE); emptyView.setVisibility(View.INVISIBLE); switch (mState.getValue()) { case 0://加载中 loadingView.setVisibility(View.VISIBLE); break; case 1://加载成功 successView.setVisibility(View.VISIBLE); break; case 2://加载失败 errorView.setVisibility(View.VISIBLE); break; case 3://加载数据为空 emptyView.setVisibility(View.VISIBLE); break; } } /** * 加载数据,然后刷新page */ public void loadDataAndRefreshPage(){ new Thread(){ public void run() { //模拟请求服务器的耗时操作 SystemClock.sleep(1500);//睡1.5秒 //1.得到请求回来的数据 Object data = loadData(); //2.根据data判断对应的状态,并赋值给当前的state mState = checkData(data); //3.根据新的state,刷新Page CommonUtil.runOnUIThread(new Runnable() { @Override public void run() { //在主线程更新UI showPage(); } }); }; }.start(); } /** * 根据data判断对应的state * @param data * @return */ private PageState checkData(Object data){ if(data==null){ return PageState.STATE_ERROR;//加载数据失败的状态 }else { if(data instanceof List){ List list = (List) data; if(list.size()==0){ //说明本次请求成功,但是木有数据了 return PageState.STATE_EMPTY;//加载数据为空的状态 }else { //说明服务器返回的是列表数据 return PageState.STATE_SUCCESS;//加载数据成功的状态 } }else { //就是java bean return PageState.STATE_SUCCESS;//加载数据成功的状态 } } } /** * 创建成功的View,由于每个界面的SuccessView不一样,所以应该有每个界面自己 * 提供和实现 * @return */ public abstract View createSuccessView(); /** * 加载数据,由于我们只关心请求回来的数据,并不关心加载数据的过程,所以每个子类只需要实现该方法 * @return */ public abstract Object loadData(); } </span>
    转载请注明原文地址: https://ju.6miu.com/read-1299859.html
    最新回复(0)