Android快速开发之——最常用的基本列表框架搭建
2017-10-17 12:23
726 查看
框架基本介绍:
这是一个基本的列表页面的开发框架,这个列表页面的功能有:可自由配置标题栏、下拉刷新、上拉加载、网络请求时展示等待动画、请求失败及数据为空的页面展示。
写在前面:
本文可以自由的进行网络请求框架、图片加载框架、上拉刷新下拉加载框架、加载等待动效框架的自由配置。配置鸿洋大神的万能的ListView的适配器框架。
这样一个完整功能的列表页面,你们需要多少代码?
这么些代码就能直接完成这样的一个完成的页面的开发。而且类似功能的代码只需要继承基类,做一个json数据解析,创建列表适配器。
我的无敌基类。
相对的列表以及所有的View都只需要给基类配置。
子类只需要创建一个类,在mainfest文件种注册,并继承基类。对接口进行初始化,就可以实现功能完善的列表页面。
这是一个基本的列表页面的开发框架,这个列表页面的功能有:可自由配置标题栏、下拉刷新、上拉加载、网络请求时展示等待动画、请求失败及数据为空的页面展示。
写在前面:
本文可以自由的进行网络请求框架、图片加载框架、上拉刷新下拉加载框架、加载等待动效框架的自由配置。配置鸿洋大神的万能的ListView的适配器框架。
这样一个完整功能的列表页面,你们需要多少代码?
private List<BeanMyTask> datas; private CommeAdapter<BeanMyTask> adapter; @Override protected UsingListBySon initDataBySon() { return new UsingListBySon(){ @Override public void parseJsonMessage(String msg) { try { loadingSwitch(false); refershSwitch(true); refershSwitch(false); Gson gson = new Gson(); BeanMyTaskNet beanMyTaskNet = gson.fromJson(msg , BeanMyTaskNet.class); if (!beanMyTaskNet.isSuccess()){ OkToast.getInstance(beanMyTaskNet.getMsg()); }else { int counts = beanMyTaskNet.getBody().getDatas().size(); if (counts <= 0){ emptySwitch(true); }else { emptySwitch(false); errorSwitch(false); for (int i = 0; i <counts ; i++){ BeanMyTaskNet.BodyBean.DatasBean dataBean = beanMyTaskNet.getBody().getDatas().get(i); datas.add(new BeanMyTask(ParseHtmlCode.ParseCode(dataBean.getName()) , dataBean.getWorkTasking().getId() , dataBean.getStatus() ,dataBean.getAssessType() , dataBean.getWorkTasking().getScore()+"分" , dataBean.getEndTime() , dataBean.getStatus(),dataBean.getOffice().getId())); } adapter.notifyDataSetChanged(); thinkNextPageNo(beanMyTaskNet.getBody().getCount()); } } }catch (Exception e){ e.printStackTrace(); } } @Override public void insertAdapter(ListView parentListView) { parentListView.setAdapter(adapter); } @Override public String insertUrl() { return "http://www.dbdjypt.com:81/mobile/index/WDRWlist;JSESSIONID=79d66350590d495ba328d81b8a3812b1"; } @Override public void clearDatas() { datas.clear(); } }; } @Override protected void init(Bundle savedInstanceState){ initDatas(); setLeftBtn(true, R.drawable.bbck, new View.OnClickListener(){ @Override public void onClick(View v){ finish(); overridePendingTransition(R.anim.left_fadein,R.anim.left_fadeout); } }); setTopTitle( "测试展示的列表页面" , true ); setRightBtn( false , 0 , null ); } private void initDatas(){ datas = new ArrayList<>(); adapter = new CommeAdapter<BeanMyTask>(datas , AnticityTestListBar.this , R.layout.item_mytask) { @Override public void cover(MyViewHolder holder, BeanMyTask item) { holder.setText(R.id.task_title , item.getTitle()); holder.setText(R.id.task_score , "任务分值:"+item.getScore()); holder.setText(R.id.task_type , "考核类别:"+item.getType()); holder.setText(R.id.task_statue , "任务状态:"+item.getStatue()); } }; }
这么些代码就能直接完成这样的一个完成的页面的开发。而且类似功能的代码只需要继承基类,做一个json数据解析,创建列表适配器。
我的无敌基类。
/** * 不必在乎你为何这么长 因为你是万能上帝类啊!! */ public abstract class TopbarBaseListActivity extends Activity{ private UsingListBySon usingListBySon; private View emptyPage , errorPage; private MyTaskStackTrace queue; public static final int NO_STATUE_BAR = 0; public static final int ALPHA_STATUE_BAR = 1; public static final int NOMAL_STATUE_BAR = 2; private RelativeLayout wTopbar; private ImageButton wLeft_btn; private TextView wTitle; private TextView wRight_text; private ImageButton wRight_btn; private TwinklingRefreshLayout wRefresh; private ListView wBeas_list; private AVLoadingIndicatorView wAvi; private int notePage = 1; private boolean canNextPage = false ; private void initBaseDatas(){ queue = new MyTaskStackTrace(5); } //在页面进行初始化的操作 protected abstract UsingListBySon initDataBySon(); protected abstract void init(Bundle savedInstanceState); //根据子类的传参 初始化网络请求 POST 请求 public void getActivityByPost(){ wAvi.setVisibility(View.VISIBLE); String url = usingListBySon.insertUrl(); MyHttpResponse response = new 116b7 MyHttpResponse(url,"{\"pageNo\":\""+notePage+"\"}", MyHttpResponse.MY_POST, new NetWorlkCallBack(){ @Override public void getSuccessMessage(String msg){ usingListBySon.parseJsonMessage(msg); } @Override public void getErrorMsg(String msg){ wAvi.setVisibility(View.GONE); errorPage.setVisibility(View.VISIBLE); wRefresh.finishLoadmore(); wRefresh.finishRefreshing(); } }); queue.addThreadToPool(response , "getListByPost"); } //根据子类的传参 初始化网络请求 GET 请求 public void getActivityByGet(String portName , String params){ String url = ""; MyHttpResponse response = new MyHttpResponse(url, "" , MyHttpResponse.MY_GET , new NetWorlkCallBack() { @Override public void getSuccessMessage(String msg){ } @Override public void getErrorMsg(String msg){ } }); queue.addThreadToPool( response , "getListByGet" ); } private void initBaseViews(){ emptyPage = findViewById(R.id.empty); errorPage = findViewById(R.id.basy); wTopbar = (RelativeLayout) findViewById(R.id.topbar); wLeft_btn = (ImageButton) findViewById(R.id.left_btn); wTitle = (TextView) findViewById(R.id.title); wRight_text = (TextView) findViewById(R.id.right_text); wRight_btn = (ImageButton) findViewById(R.id.right_btn); wRefresh = (TwinklingRefreshLayout) findViewById(R.id.refresh); wBeas_list = (ListView) findViewById(R.id.beas_list); wAvi = (AVLoadingIndicatorView) findViewById(R.id.avi); } private void initBaseViewEvents(){ usingListBySon.insertAdapter(wBeas_list); //下拉的时候刷新 上拉的时候加载更多。。 wRefresh.setOnRefreshListener(new RefreshListenerAdapter() { @Override public void onLoadMore(TwinklingRefreshLayout refreshLayout) { super.onLoadMore(refreshLayout); if (canNextPage){ getActivityByPost(); }else{ refreshLayout.finishLoadmore(); OkToast.getInstance("已加载了全部的数据").show(); } } @Override public void onRefresh(TwinklingRefreshLayout refreshLayout) { super.onRefresh(refreshLayout); wRefresh.finishRefreshing(); usingListBySon.clearDatas(); notePage = 1; canNextPage = false; getActivityByPost(); } }); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_topbar_base_list); initBaseDatas(); initBaseViews(); init(savedInstanceState); this.usingListBySon = initDataBySon(); initBaseViewEvents(); getActivityByPost(); } //设置状态栏样式 protected void setStatueBar(int style){ switch (style){ case NO_STATUE_BAR: try { if ( Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP ) { Window window = getWindow(); window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); } } catch (Exception e) { e.printStackTrace(); } break; case ALPHA_STATUE_BAR: try { if ( Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP ) { Window window = getWindow(); window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); } } catch (Exception e){ e.printStackTrace(); } break; } } //设置标题名称 protected void setTopTitle(String topName , boolean show){ if (show){ if (!TextUtils.isEmpty(topName)){ wTitle.setText(topName); } }else{ wTopbar.setVisibility(View.GONE); } } //设置标题栏左侧的按钮 protected void setLeftBtn(boolean show , int ResId , View.OnClickListener leftClick){ if (show){ wLeft_btn.setBackgroundResource(ResId); wLeft_btn.setOnClickListener(leftClick); }else { wLeft_btn.setVisibility(View.GONE); } } //设置标题栏右侧的按钮 protected void setRightBtn(boolean show , int ResId , View.OnClickListener rightClick){ wRight_text.setVisibility(View.GONE); if (show){ wRight_btn.setBackgroundResource(ResId); wRight_btn.setOnClickListener(rightClick); }else { wRight_btn.setVisibility(View.GONE); } } //设置右侧文字按钮 protected void setRightText(String text , View.OnClickListener r_textClick){ wRight_btn.setVisibility(View.GONE); wRight_text.setText(text); wRight_text.setOnClickListener(r_textClick); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN){ finish(); overridePendingTransition(R.anim.left_fadein,R.anim.left_fadeout); return true; }else { return super.onKeyDown(keyCode , event); } } @Override public void startActivity(Intent intent) { super.startActivity(intent); overridePendingTransition(R.anim.right_fadein,R.anim.right_fadeout); } //判断当前的状态是否可以进行分页 并修改相关状态位 private void thinkNextNest(int currentPage , int counts){ if ( 10*currentPage < counts ){ canNextPage = true; notePage = currentPage+1; }else { canNextPage = false; } } @Override protected void onDestroy() { super.onDestroy(); if ( queue != null ){ queue.closeThreadPoolNow(); queue = null; } } //创建一个内部接口 用于子类进行回调业务 public interface UsingListBySon{ public void parseJsonMessage(String msg); public void insertAdapter(ListView parentListView); public String insertUrl(); public void clearDatas(); } //给子类提供的一些接口性质的控制器 //数据非空的控制器 protected void emptySwitch(boolean open){ emptyPage.setVisibility(open ? View.VISIBLE : View.GONE); } //网络请求的控制器 protected void errorSwitch(boolean open){ errorPage.setVisibility(open ? View.VISIBLE : View.GONE); } //加载中。。。的控制器 protected void loadingSwitch(boolean open){ wAvi.setVisibility(open ? View.VISIBLE : View.GONE); } //上拉、下拉框架停止刷新的控制器 protected void refershSwitch(boolean up){ if (up){ wRefresh.finishRefreshing(); }else { wRefresh.finishLoadmore(); } } //判断下一页的页码的 逻辑 protected void thinkNextPageNo(int number){ thinkNextNest(notePage , number); } }
相对的列表以及所有的View都只需要给基类配置。
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/white" tools:context="com.huaxinzhi.policepartybuilding.TopbarBaseListActivity"> <RelativeLayout android:id="@+id/topbar" android:layout_width="match_parent" android:layout_height="50dp" android:background="@color/colorPrimary"> <ImageButton android:scaleX="0.5" android:scaleY="0.5" android:id="@+id/left_btn" android:layout_width="50dp" android:layout_height="50dp"/> <TextView android:id="@+id/title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@color/white" android:layout_centerInParent="true" android:textSize="18sp"/> <TextView android:id="@+id/right_text" android:gravity="center_vertical" android:paddingLeft="10dp" android:paddingRight="10dp" android:textColor="@color/white" android:layout_alignParentRight="true" android:layout_width="wrap_content" android:layout_height="match_parent"/> <ImageButton android:scaleX="0.5" android:scaleY="0.5" android:id="@+id/right_btn" android:layout_width="50dp" android:layout_height="50dp" android:layout_alignParentRight="true"/> </RelativeLayout> <!--列表页面在上帝类中进行展示--> <com.lcodecore.tkrefreshlayout.TwinklingRefreshLayout android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/refresh"> <ListView android:scrollbars="none" android:id="@+id/beas_list" android:layout_width="match_parent" android:layout_height="match_parent"/> <!--数据加载中的等待动画效果--> <com.wang.avi.AVLoadingIndicatorView android:visibility="gone" app:indicatorName="BallPulseIndicator" app:indicatorColor="@color/black" android:id="@+id/avi" android:layout_width="50dp" android:layout_height="50dp" android:layout_centerInParent="true" style="@style/AVLoadingIndicatorView.Small"/> <!--显示的占位界面--> <include android:visibility="gone" android:id="@+id/empty" layout="@layout/view_emptydata" android:layout_width="match_parent" android:layout_height="match_parent"/> <include android:visibility="gone" android:id="@+id/basy" layout="@layout/view_errorserver" android:layout_width="match_parent" android:layout_height="match_parent"/> </com.lcodecore.tkrefreshlayout.TwinklingRefreshLayout> </LinearLayout>
子类只需要创建一个类,在mainfest文件种注册,并继承基类。对接口进行初始化,就可以实现功能完善的列表页面。
private List<BeanMyTask> datas; private CommeAdapter<BeanMyTask> adapter; @Override protected UsingListBySon initDataBySon() { return new UsingListBySon(){ @Override public void parseJsonMessage(String msg) { try { loadingSwitch(false); refershSwitch(true); refershSwitch(false); Gson gson = new Gson(); BeanMyTaskNet beanMyTaskNet = gson.fromJson(msg , BeanMyTaskNet.class); if (!beanMyTaskNet.isSuccess()){ OkToast.getInstance(beanMyTaskNet.getMsg()); }else { int counts = beanMyTaskNet.getBody().getDatas().size(); if (counts <= 0){ emptySwitch(true); }else { emptySwitch(false); errorSwitch(false); for (int i = 0; i <counts ; i++){ BeanMyTaskNet.BodyBean.DatasBean dataBean = beanMyTaskNet.getBody().getDatas().get(i); datas.add(new BeanMyTask(ParseHtmlCode.ParseCode(dataBean.getName()) , dataBean.getWorkTasking().getId() , dataBean.getStatus() ,dataBean.getAssessType() , dataBean.getWorkTasking().getScore()+"分" , dataBean.getEndTime() , dataBean.getStatus(),dataBean.getOffice().getId())); } adapter.notifyDataSetChanged(); thinkNextPageNo(beanMyTaskNet.getBody().getCount()); } } }catch (Exception e){ e.printStackTrace(); } } @Override public void insertAdapter(ListView parentListView) { parentListView.setAdapter(adapter); } @Override public String insertUrl() { return "http://www.dbdjypt.com:81/mobile/index/WDRWlist;JSESSIONID=79d66350590d495ba328d81b8a3812b1"; } @Override public void clearDatas() { datas.clear(); } }; } @Override protected void init(Bundle savedInstanceState){ initDatas(); setLeftBtn(true, R.drawable.bbck, new View.OnClickListener(){ @Override public void onClick(View v){ finish(); overridePendingTransition(R.anim.left_fadein,R.anim.left_fadeout); } }); setTopTitle( "测试展示的列表页面" , true ); setRightBtn( false , 0 , null ); } private void initDatas(){ datas = new ArrayList<>(); adapter = new CommeAdapter<BeanMyTask>(datas , AnticityTestListBar.this , R.layout.item_mytask) { @Override public void cover(MyViewHolder holder, BeanMyTask item) { holder.setText(R.id.task_title , item.getTitle()); holder.setText(R.id.task_score , "任务分值:"+item.getScore()); holder.setText(R.id.task_type , "考核类别:"+item.getType()); holder.setText(R.id.task_statue , "任务状态:"+item.getStatue()); } }; }
相关文章推荐
- Android快速开发,十个最常用的框架
- Android快速开发,十个最常用的框架
- Android 框架搭建 - 快速开发(持续加入中)
- Android开发truck快速开发框架 常用工具集合(九)
- Android常用的快速开发框架
- 9款Android常用的快速开发框架
- 9款Android常用的快速开发框架
- Android快速开发,十个最常用的框架
- Android快速开发集成框架 包含所有常用资源
- Android 框架:快速开发中Util常用工具类总结
- Android快速开发,十个最常用的框架
- 常用Android快速开发框架
- Android快速开发,十个最常用的框架
- Android快速开发框架Android_BaseLib,集成了常用工具类,自定义View控件,Base基类封装,常用开源框架
- 以简求快 Java快速开发框架LML之velocity常用基本语法
- Android常用框架(快速开发)
- Android游戏开发:游戏框架的搭建(2)
- Mybatis框架的手动搭建以及Mybatis的常用基本应用
- Android游戏开发:游戏框架的搭建(3)
- Android游戏开发:游戏框架的搭建(1)