Android开篇之listview加载中、无数据、等各种状态

一,概述

          经常我们刷新listview的时候,正常情况下会有数据,我们会按照正常情况让他展示数据。当没有数据的时候我们会用setemptyview方法。可是当我们遇到加载失败的时候怎么办,没有网络的时候怎么。这时候我们就必须自己根据需求来统一定义我们的内容界面,通常情况下。会有以下几种状态包括无数据、加载异常、正在加载、数据正常及全部不显示(根据需求自己定义的一个界面)

二,分析

         接下来,我们就来上码
[java] view plain copy
 
  1. /** 
  2.  * 不同状态的显示站位图(包括无数据,加载异常,正在加载,数据正常以及全部不显示5种状态) 
  3.  */  
  4. public class StatusSwitchLayout extends RelativeLayout {  
  5.     private View vContentView;  
  6.     private LinearLayout vRequestLayout;  
  7.     private LinearLayout vFailureLayout;  
  8.     private LinearLayout vNoDataLayout;  
  9.       
  10.     private ImageView vRequestImg;  
  11.     private ImageView vFailureImg;  
  12.     private ImageView vNoDataImg;  
  13.     private Button vNoDataBtn;  
  14.   
  15.     public StatusSwitchLayout(Context context, AttributeSet attrs, int defStyle) {  
  16.         super(context, attrs, defStyle);  
  17.         initWithContext(context);  
  18.     }  
  19.   
  20.     public StatusSwitchLayout(Context context, AttributeSet attrs) {  
  21.         super(context, attrs);  
  22.         initWithContext(context);  
  23.     }  
  24.   
  25.     public StatusSwitchLayout(Context context) {  
  26.         super(context);  
  27.         initWithContext(context);  
  28.     }  
  29.       
  30.     private void initWithContext(Context context){  
  31.         LayoutInflater inflater=(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);  
  32.         inflater.inflate(R.layout.status_switch_layout, this);  
  33.           
  34.         vRequestLayout = (LinearLayout)findViewById(R.id.request_layout);  
  35.         vFailureLayout = (LinearLayout)findViewById(R.id.loading_failure_layout);  
  36.         vNoDataLayout = (LinearLayout)findViewById(R.id.no_data_layout);  
  37.           
  38.         vRequestImg = (ImageView)findViewById(R.id.request_loading_img);  
  39.         vFailureImg = (ImageView)findViewById(R.id.loading_failure_img);  
  40.         vNoDataImg = (ImageView)findViewById(R.id.no_data_img);  
  41.         vNoDataBtn = (Button)findViewById(R.id.other_operate_button);  
  42.           
  43.     }  
  44.       
  45.     public View getContentView() {  
  46.         return vContentView;  
  47.     }  
  48.       
  49.     /** 
  50.      * 设置content layout 便于统一控制显示哪个layout 
  51.      * @param vContentView 
  52.      */  
  53.     public void setContentView(View vContentView) {  
  54.         this.vContentView = vContentView;  
  55.     }  
  56.   
  57.     public LinearLayout getRequestLayout() {  
  58.         return vRequestLayout;  
  59.     }  
  60.   
  61.     public LinearLayout getFailureLayout() {  
  62.         return vFailureLayout;  
  63.     }  
  64.   
  65.     public LinearLayout getNoDataLayout() {  
  66.         return vNoDataLayout;  
  67.     }  
  68.   
  69.     public ImageView getRequestImg() {  
  70.         return vRequestImg;  
  71.     }  
  72.   
  73.     public ImageView getFailureImg() {  
  74.         return vFailureImg;  
  75.     }  
  76.   
  77.     public ImageView getNoDataImg() {  
  78.         return vNoDataImg;  
  79.     }  
  80.   
  81.     public Button getNoDataBtn() {  
  82.         return vNoDataBtn;  
  83.     }  
  84.   
  85.     public void setRequestImgRes(int resId){  
  86.         vRequestImg.setImageResource(resId);  
  87.     }  
  88.       
  89.     public void setFailureImgRes(int resId){  
  90.         vFailureImg.setImageResource(resId);  
  91.     }  
  92.       
  93.     public void setNoDataImgRes(int resId){  
  94.         vNoDataImg.setImageResource(resId);  
  95.     }  
  96.       
  97.     public void setNoDataBtnBg(int resId){  
  98.         vNoDataBtn.setBackgroundResource(resId);  
  99.     }  
  100.       
  101.     public void showContentLayout(){  
  102.         showWhichLayout(0);  
  103.     }  
  104.       
  105.     public void showNoDataLayout(){  
  106.         showWhichLayout(1);  
  107.     }  
  108.       
  109.     public void showRequestLayout(){  
  110.         showWhichLayout(2);  
  111.     }  
  112.       
  113.     public void showFailureLayout(){  
  114.         showWhichLayout(3);  
  115.     }  
  116.       
  117.     public void dismissAll(){  
  118.         showWhichLayout(4);  
  119.     }  
  120.       
  121.     /** 
  122.      * 0.代表显示content layout,1.代表显示无数据layout,2.代表显示请求layout,3.代表显示失败layout, 4.代表均不显示(预留显示其他可能的布�?) 
  123.      * @param index 
  124.      */  
  125.     private void showWhichLayout(int index){  
  126.         switch (index) {  
  127.         case 0:  
  128.             if(null != vContentView && vContentView.getVisibility() == View.GONE){  
  129.                 showView(vContentView);  
  130.             }  
  131.             if(vNoDataLayout.getVisibility() == View.VISIBLE){  
  132.                 dismissView(vNoDataLayout);  
  133.             }  
  134.             if(vRequestLayout.getVisibility() == View.VISIBLE){  
  135.                 dismissView(vRequestLayout);  
  136.             }  
  137.             if(vFailureLayout.getVisibility() == View.VISIBLE){  
  138.                 dismissView(vFailureLayout);  
  139.             }  
  140.             break;  
  141.         case 1:  
  142.             if(null != vContentView && vContentView.getVisibility() == View.VISIBLE){  
  143.                 dismissView(vContentView);  
  144.             }  
  145.             if(vNoDataLayout.getVisibility() == View.GONE){  
  146.                 showView(vNoDataLayout);  
  147.             }  
  148.             if(vRequestLayout.getVisibility() == View.VISIBLE){  
  149.                 dismissView(vRequestLayout);  
  150.             }  
  151.             if(vFailureLayout.getVisibility() == View.VISIBLE){  
  152.                 dismissView(vFailureLayout);  
  153.             }  
  154.             break;  
  155.         case 2:  
  156.             if(null != vContentView && vContentView.getVisibility() == View.VISIBLE){  
  157.                 dismissView(vContentView);  
  158.             }  
  159.             if(vNoDataLayout.getVisibility() == View.VISIBLE){  
  160.                 dismissView(vNoDataLayout);  
  161.             }  
  162.             if(vRequestLayout.getVisibility() == View.GONE){  
  163.                 showView(vRequestLayout);  
  164.             }  
  165.             if(vFailureLayout.getVisibility() == View.VISIBLE){  
  166.                 dismissView(vFailureLayout);  
  167.             }  
  168.             break;  
  169.         case 3:  
  170.             if(null != vContentView && vContentView.getVisibility() == View.VISIBLE){  
  171.                 dismissView(vContentView);  
  172.             }  
  173.             if(vNoDataLayout.getVisibility() == View.VISIBLE){  
  174.                 dismissView(vNoDataLayout);  
  175.             }  
  176.             if(vRequestLayout.getVisibility() == View.VISIBLE){  
  177.                 dismissView(vRequestLayout);  
  178.             }  
  179.             if(vFailureLayout.getVisibility() == View.GONE){  
  180.                 showView(vFailureLayout);  
  181.             }  
  182.             break;  
  183.         case 4:  
  184.             if(null != vContentView && vContentView.getVisibility() == View.VISIBLE){  
  185.                 dismissView(vContentView);  
  186.             }  
  187.             if(vNoDataLayout.getVisibility() == View.VISIBLE){  
  188.                 dismissView(vNoDataLayout);  
  189.             }  
  190.             if(vRequestLayout.getVisibility() == View.VISIBLE){  
  191.                 dismissView(vRequestLayout);  
  192.             }  
  193.             if(vFailureLayout.getVisibility() == View.VISIBLE){  
  194.                 dismissView(vFailureLayout);  
  195.             }  
  196.             break;  
  197.         default:  
  198.             break;  
  199.         }  
  200.     }  
  201.       
  202.     private void showView(View view){  
  203.         view.setAlpha(0f);    
  204.         view.setVisibility(View.VISIBLE);  
  205.             
  206.         view.animate()    
  207.             .alpha(1f)    
  208.             .setDuration(300)    
  209.             .setListener(null);          
  210.   
  211.     }  
  212.       
  213.     private void dismissView(final View view){  
  214.         view.setVisibility(View.GONE);  
  215. //      view.animate()    
  216. //        .alpha(0f)    
  217. //        .setDuration(300)    
  218. //        .setListener(new AnimatorListenerAdapter() {    
  219. //            @Override    
  220. //            public void onAnimationEnd(Animator animation) {    
  221. //                
  222. //            }    
  223. //        });    
  224.   
  225.           
  226.     }  
  227.       
  228. }  
这里逻辑很简单,大家看下代码就知道,其实就是自定义一个新的共有界面。根据逻辑做出判断就可以了。当我们定义好这个自定义控件,我们会在布局文件里先定义好,如下
[html] view plain copy
 
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     xmlns:tools="http://schemas.android.com/tools"  
  4.     android:id="@+id/activity_main"  
  5.     android:layout_width="match_parent"  
  6.     android:layout_height="match_parent"  
  7.     android:paddingBottom="@dimen/activity_vertical_margin"  
  8.     android:paddingLeft="@dimen/activity_horizontal_margin"  
  9.     android:paddingRight="@dimen/activity_horizontal_margin"  
  10.     android:paddingTop="@dimen/activity_vertical_margin"  
  11.     tools:context="com.nanjing.test.status.MainActivity">  
  12.   
  13. <RelativeLayout  
  14.     android:layout_width="match_parent"  
  15.     android:layout_height="match_parent">  
  16.     <com.handmark.pulltorefresh.library.PullToRefreshListView  
  17.         android:id="@+id/listview"  
  18.         android:layout_width="match_parent"  
  19.         android:layout_height="match_parent"  
  20.        />  
  21.     <include  
  22.         layout="@layout/status_layout"/>  
  23. </RelativeLayout>  
  24. </RelativeLayout>  
这里面的incude就是包含我们定义的控件。然后在activity里正常调用就可以了
[java] view plain copy
 
  1. public class MainActivity extends AppCompatActivity {  
  2.     //可以是各种view  
  3.     private PullToRefreshListView vLv;  
  4.     //占位状态  
  5.     private StatusSwitchLayout vstatues;  
  6.     //  
  7.     private List<String> mdata;  
  8.     private MyAdapter adapter;  
  9.     @Override  
  10.     protected void onCreate(Bundle savedInstanceState) {  
  11.         super.onCreate(savedInstanceState);  
  12.         setContentView(R.layout.activity_main);  
  13.         initView();  
  14.         initData();  
  15.         initClick();  
  16.     }  
  17.   
  18.     private void initView() {  
  19.         vLv=(PullToRefreshListView)findViewById(R.id.listview);  
  20.         vstatues=(StatusSwitchLayout)findViewById(R.id.status_layout);  
  21.         //将view加载到状态里面去  
  22.         vstatues.setContentView(vLv);  
  23.         vstatues.getNoDataBtn().setText("没有数据");  
  24.     }  
  25.   
  26.     private void initData() {  
  27.         mdata=new ArrayList<>();  
  28.         for(int i=0;i<20;i++){  
  29.             mdata.add("今天天气不错"+i);  
  30.         }  
  31.         adapter=new MyAdapter(this,mdata);  
  32.         vLv.setAdapter(adapter);  
  33.         vstatues.showContentLayout();  
  34.         //网络状态  
  35.         if(!isNetworkConnected(this)){  
  36.             vstatues.showFailureLayout();  
  37.         }  
  38.     }  
  39.   
  40.     private void initClick() {  
  41.         vLv.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener2<ListView>() {  
  42.             @Override  
  43.             public void onPullDownToRefresh(PullToRefreshBase<ListView> refreshView) {  
  44.                 // 模拟无网络的时候,加载失败的时候(当打开网络。可以点击就有数据了)。及正常状态的时候  
  45. //                vLv.postDelayed(new Runnable() {  
  46. //                    @Override  
  47. //                    public void run() {  
  48. //                        initData();  
  49. //                        mdata.add("注意这里添加了一条数据。点击刷新会在数据的末尾加上这句");  
  50. //                        adapter.notifyDataSetChanged();  
  51. //                        vLv.onRefreshComplete();  
  52. //                    }  
  53. //                }, 1000);  
  54.   
  55.   
  56. //              模拟没有数据  
  57.                 initData();  
  58.                 mdata=null;  
  59.                 vstatues.showNoDataLayout();  
  60.             }  
  61.   
  62.             @Override  
  63.             public void onPullUpToRefresh(PullToRefreshBase<ListView> refreshView) {  
  64.   
  65.             }  
  66.         });  
  67.         vstatues.getFailureLayout().setOnClickListener(new View.OnClickListener() {  
  68.             @Override  
  69.             public void onClick(View v) {  
  70.                 vstatues.getRequestLayout();  
  71.                 initData();  
  72.             }  
  73.         });  
  74.     }  
  75.   
  76.     private class MyAdapter extends BaseAdapter{  
  77.         private Context mcontext;  
  78.         private List<String> mdata;  
  79.         public MyAdapter(Context mcontext,List<String> mdata){  
  80.             this.mcontext=mcontext;  
  81.             this.mdata=mdata;  
  82.         }  
  83.         @Override  
  84.         public int getCount() {  
  85.             return mdata.size();  
  86.         }  
  87.         @Override  
  88.         public long getItemId(int position) {  
  89.             return position;  
  90.         }  
  91.   
  92.         @Override  
  93.         public Object getItem(int position) {  
  94.             return mdata.get(position);  
  95.         }  
  96.   
  97.         @Override  
  98.         public View getView(int position, View convertView, ViewGroup parent) {  
  99.             convertView= LayoutInflater.from(mcontext).inflate(R.layout.item,null);  
  100.             TextView tv=(TextView)convertView.findViewById(R.id.tv);  
  101.             tv.setText(mdata.get(position).toString());  
  102.             return convertView;  
  103.         }  
  104.     }  
  105.     //判断是否有网络连接  
  106.     public boolean isNetworkConnected(Context context) {  
  107.         if (context != null) {  
  108.             ConnectivityManager mConnectivityManager = (ConnectivityManager) context  
  109.                     .getSystemService(Context.CONNECTIVITY_SERVICE);  
  110.             NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();  
  111.             if (mNetworkInfo != null) {  
  112.                 return mNetworkInfo.isAvailable();  
  113.             }  
  114.         }  
  115.         return false;  
  116.     }  
  117. }  
小编只是单纯的用这个控件展示了下。供大家参考,若使用到代码中,还要与网络请求做好数据的处理,稍微改动下就可以使用

三,效果展示

效果入上图所示。自我感觉还可以。哈哈,由于小编水平有限。如有不当之处,还望不吝赐教,谢谢
代码资源资源在这
posted @ 2017-04-25 10:32  天涯海角路  阅读(534)  评论(0)    收藏  举报