Android ListView 下拉刷新 上拉更多[实例]

今天得需求是做listview+上下拉动在header和footer显示progressdialog,但不影响用户操作

直接上代码,我已经加上注释了,自己看。

 

 

复制代码
package  com.stay.main;

import  java.net.HttpURLConnection;
import  java.util.ArrayList;
import  java.util.HashMap;

import  org.json.JSONObject;

import  android.app.Activity;
import  android.app.ProgressDialog;
import  android.graphics.drawable.Drawable;
import  android.os.Bundle;
import  android.os.Handler;
import  android.os.HandlerThread;
import  android.os.Looper;
import  android.os.Message;
import  android.view.LayoutInflater;
import  android.view.View;
import  android.widget.AbsListView;
import  android.widget.AbsListView.OnScrollListener;
import  android.widget.Button;
import  android.widget.LinearLayout;
import  android.widget.ListView;
import  android.widget.RelativeLayout;
import  android.widget.TextView;

import  com.stay.wifi.R;

/**
 * 
@author  Stay 
 * 动态加载listview数据,上拉 刷新,下拉 更多
 
*/
public   class  ListViewActivity  extends  Activity  implements  OnScrollListener {
    
private   static   final   int  LOAD  =   0 ;
    
private   static   final   int  ERROR  =   0 ;
    
private   static   final   int  MEMBER  =   1 ;
    
private   static   final   int  LOADED  =   2 ;
    
private   static   final   int  DIALOG  =   3 ;
    
private   static   final   int  FULL  =   4 ;
    
private  NearbyAdapter adapter;
    
private  ListView nearby_lv;
    
private  RelativeLayout nearby_lv_header;
    
private  Button list_bottom_btn;
    
private  LinearLayout list_bottom_linear;
    
private  TextView bottom_progress_text;
    
private  RelativeLayout nearby_lv_footer;
    
private  Button list_header_btn;
    
private  LinearLayout list_header_linear;
    
private  TextView heard_progress_text;
    
private  ArrayList < JSONObject >  nearby_data  =   new  ArrayList < JSONObject > ();
    
private   int  lastItem;
    
private  HashMap < String, Drawable >  imageCache;
    
private  com.stay.main.ListViewActivity.MyHandler myHandler;
    
private  ProgressDialog dialog;
    
private   int  curPage  =   1 ;
    
private   boolean  isMember  =   false ;
    
private   int  firstItem;
    
public   int  count;

    
/**  Called when the activity is first created.  */
    @Override
    
public   void  onCreate(Bundle savedInstanceState) {
        
super .onCreate(savedInstanceState);
        setContentView(R.layout.main);
        initView();
        myHandler.sendEmptyMessage(LOAD);
    }

    @Override
    
public   void  onScrollStateChanged(AbsListView view,  int  scrollState) {
        DebugUtil.debug(
" onScrollStateChanged " );
        
// 当滚动停止且滚动的总数等于数据的总数,去加载
         if  (lastItem  ==  count  &&  scrollState  ==  SCROLL_STATE_IDLE) {
            DebugUtil.debug(
" onScrollStateChanged--------next " );
            
if  (curPage  ==   4   &&   ! isMember) {
                DebugUtil.show(
this " 您不是正式会员,请申请正式会员, " );
                list_bottom_linear.setVisibility(View.GONE);
            } 
else  {
                
// 加载数据
                myHandler.sendEmptyMessage(LOAD);
            }
            
return ;
        }
        
// 当往上拉时更新数据,将data清空然后去重新加载
         if  (firstItem  ==   0   &&  scrollState  ==  SCROLL_STATE_IDLE) {
            DebugUtil.debug(
" onScrollStateChanged--------refresh " );
            curPage 
=   0 ;
            myHandler.sendEmptyMessage(LOAD);
        }
    }

    @Override
    
public   void  onScroll(AbsListView view,  int  firstVisibleItem,  int  visibleItemCount,  int  totalItemCount) {
        DebugUtil.debug(
" firstVisibleItem= "   +  firstVisibleItem);
        DebugUtil.debug(
" visibleItemCount= "   +  visibleItemCount);
        DebugUtil.debug(
" totalItemCount= "   +  totalItemCount);
        
// 这里要减二,因为我加了header footer
        lastItem  =  firstVisibleItem  +  visibleItemCount  -   2 ;
        firstItem 
=  firstVisibleItem;
    }

    
public   int  getData() {
        
try  {
            HttpURLConnection conn 
=  DownloadUtil.download(url//自己写咯 );
            ArrayList
< JSONObject >  temp  =  JSONUtil.streamToJsonList(conn.getInputStream());
            
if  (curPage  ==   0   &&  nearby_data.size()  >   0 ) {
                nearby_data.clear();
                count 
=   0 ;
            }
            
if  (temp  !=   null   &&  temp.size()  >   0 ) {
                count 
+=  temp.size();
                nearby_data.addAll(temp);
                DebugUtil.debug(
" nearby_data.size()= " + nearby_data.size());
            } 
else  {
                
return  FULL;
            }
            
return  LOADED;
        } 
catch  (Exception e) {
            
return  ERROR;
        }
    }

    
private  Handler handler  =   new  Handler() {
        @Override
        
public   void  handleMessage(Message msg) {
            
super .handleMessage(msg);
            
switch  (msg.what) {
            
case  DIALOG:
                list_bottom_linear.setVisibility(View.VISIBLE);
                list_header_linear.setVisibility(View.VISIBLE);
                
break ;
            
case  LOADED:
                list_bottom_linear.setVisibility(View.GONE);
                list_header_linear.setVisibility(View.GONE);
                curPage
++ ;
                adapter.notifyDataSetChanged();
                
break ;
            
case  ERROR:
                DebugUtil.debug(
" error,missing data " );
                
break ;
            
case  MEMBER:
                DebugUtil.debug(
" you must regist formal member " );
                
break ;
            
default :
                
break ;
            }
        }
    };
// 创建子线程加载数据,然后更新
     private   class  MyHandler  extends  Handler {
        
private   int  status;

        
public  MyHandler(Looper looper) {
            
super (looper);
        }

        @Override
        
public   void  handleMessage(Message msg) {
            
synchronized  ( this ) {
                
switch  (msg.what) {
                
case  LOAD: //  get data from server
                    handler.sendEmptyMessage(DIALOG); // 显示等待框
                    status  =  getData();
                    handler.sendEmptyMessageDelayed(status, 
1000 );
                    
break ;
                
default :
                    
break ;
                }
            }
        }
    }

    
public   void  initView() {
        imageCache 
=   new  HashMap < String, Drawable > ();
        HandlerThread handlerThread 
=   new  HandlerThread( " nearby " );
        
//  在使用HandlerThread的getLooper()方法之前,必须先调用该类的start();
        handlerThread.start();
        myHandler 
=   new  MyHandler(handlerThread.getLooper());
        nearby_lv 
=  (ListView) findViewById(R.id.nearby_lv);
        nearby_lv_footer 
=  (RelativeLayout) LayoutInflater.from(ListViewActivity. this ).inflate(R.layout.nearby_lv_header,  null );
        list_bottom_btn 
=  (Button) nearby_lv_footer.findViewById(R.id.list_bottom_btn);
        list_bottom_linear 
=  (LinearLayout) nearby_lv_footer.findViewById(R.id.list_bottom_linear);
        bottom_progress_text 
=  (TextView) nearby_lv_footer.findViewById(R.id.progress_text);
        nearby_lv_header 
=  (RelativeLayout) LayoutInflater.from(ListViewActivity. this ).inflate(R.layout.nearby_lv_header,  null );
        list_header_btn 
=  (Button) nearby_lv_header.findViewById(R.id.list_bottom_btn);
        list_header_linear 
=  (LinearLayout) nearby_lv_header.findViewById(R.id.list_bottom_linear);
        heard_progress_text 
=  (TextView) nearby_lv_header.findViewById(R.id.progress_text);
        list_header_btn.setText(
" 刷新 " );
        list_bottom_btn.setText(
" 更多 " );
        list_header_linear.setVisibility(View.GONE);
        nearby_lv.addHeaderView(nearby_lv_header);
        nearby_lv.addFooterView(nearby_lv_footer);
        
//  list_header_btn.setOnClickListener(header_click);
        adapter  =   new  NearbyAdapter(ListViewActivity. this , nearby_data);
        nearby_lv.setAdapter(adapter);
        nearby_lv.setOnScrollListener(ListViewActivity.
this );
    }
}
复制代码

 

核心部分就是这了,其他adapter,downloadUtil,debugUtil都在以前的帖子里,就不发了。

现在有最新版了。大家可以去http://www.stay4it.com/forum.php?mod=viewthread&tid=2&extra=page%3D1看看

Own Website:http://www.stay4it.com/

QQ:104816053

Android QQ Group:  点击加入

转载请注明出处http://stay.cnblogs.com/ 请尊重个人劳动成果。

你可能感兴趣的:(Android)