listView动态加载数据分页

有两种方法:

我在项目中用了两种方法,来进行listView的分页,分别是用Handler和AsyncTask。

第一种方法:用Handler和线程

看代码:

 

package com.cnjmwl.scm.salesorder;
import java.util.ArrayList;
import com.cnjmwl.scm.MainActivity;
import com.cnjmwl.scm.R;
import com.cnjmwl.util.HttpUtil;
import com.cnjmwl.util.ReadXML;
import com.cnjmwl.util.StringUtil;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.GridView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.Spinner;
import android.widget.Toast;

import android.widget.TextView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.LinearLayout.LayoutParams;


import com.cnjmwl.scm.entity.*;
public class SalesOrderActivity extends Activity implements OnScrollListener{
 private ListView mListView;
 private MyAdapter mMyAdapter;
 LinearLayout loadingLayout;
 private Thread mThread;

  /**
     * 设置布局显示属性
     */
    private LayoutParams mLayoutParams = new LinearLayout.LayoutParams(
            LinearLayout.LayoutParams.WRAP_CONTENT,
            LinearLayout.LayoutParams.WRAP_CONTENT);
    /**
     * 设置布局显示目标最大化属性
     */
    private LayoutParams FFlayoutParams = new LinearLayout.LayoutParams(
            LinearLayout.LayoutParams.FILL_PARENT,
            LinearLayout.LayoutParams.FILL_PARENT);

    private ProgressBar progressBar;
   
   
   
  /**
   * 报检属性名称
   */
 String[] strID,strUnit,strStatus,strStatusDesc,strNO,strDate,strLinkMan,strLinkTel,business;
 int maxCount;//数据库中的订单总数
 
 ArrayList<SalesOrder> lists;
 View.OnClickListener cl;
   @Override
 protected void onCreate(Bundle savedInstanceState) {
  
  super.onCreate(savedInstanceState);
   setContentView(R.layout.order_main);
   setupViews();
  
  
    
 }
   public void setupViews(){
    if(maxCount==0){
     addDeclaration();
    }
   
  
    //线性布局
    LinearLayout layout=new LinearLayout(this);
    //设置布局水平方向
    layout.setOrientation(LinearLayout.HORIZONTAL);
    //进度条
    progressBar=new ProgressBar(this);
    //把进度条加入到layout中
    layout.addView(progressBar,mLayoutParams);
    //文本内容
    TextView textView=new TextView(this);
    textView.setText("加载中...");
    textView.setGravity(Gravity.CENTER_VERTICAL);
    //把文本加入到layout中
    layout.addView(textView,FFlayoutParams);
    //设置layout的重力方向,即对齐方式是
    layout.setGravity(Gravity.CENTER);
    //设置ListView的页脚layout
    loadingLayout = new LinearLayout(this);
    loadingLayout.addView(layout,mLayoutParams);
    loadingLayout.setGravity(Gravity.CENTER);
   
    //得到一个ListView用来显示条目
    mListView=(ListView)findViewById(R.id.listview);
   
    //添加到页脚
    mListView.addFooterView(loadingLayout);  
      mMyAdapter=new MyAdapter();
      mListView.setAdapter(mMyAdapter);
      mListView.setOnScrollListener(this);
      mListView.setTextFilterEnabled(true);
      mListView.setBackgroundResource(R.drawable.background);     
      
      
     }
 
  /**
      * 向服务器请求待办列表
      */
     private String queryList(String uri){
    String url = HttpUtil.BASE_URL+uri;
   System.out.println(url);
     return HttpUtil.getHTTPUtil().queryStringForPost(url);
   }
    
  public void addDeclaration(){
   String result2=queryList("orderStatusList".trim());
    lists=ReadXML.readXML(result2).getInspection2();
    Log.v("result2--", result2);
    strID=new String[lists.size()];
    strNO=new String[lists.size()];
    strStatus=new String[lists.size()];
    strStatusDesc=new String[lists.size()];
    strUnit=new String[lists.size()];
    strDate=new String[lists.size()];
    strLinkMan=new String[lists.size()];
    strLinkTel=new String[lists.size()];
    business=new String[lists.size()];
    int i2=0;
        for(SalesOrder in:lists){
         strID[i2]=in.getId();    
         strStatus[i2]=in.getStatus();
         strDate[i2]=in.getDate();
         strLinkTel[i2]=in.getLinkTel();
       
         //business[i2]=business[i2].replace("@", "\n");
       
         if(in.getStatusDesc()!=null&&!in.getStatusDesc().equals("")){
          strStatusDesc[i2]=StringUtil.unicodeToUtf8(in.getStatusDesc());
         }else {
     strStatusDesc[i2]="";
     }
         if(in.getUnit()!=null&&!in.getUnit().equals("")){
          strUnit[i2]=StringUtil.unicodeToUtf8(in.getUnit());
         }else {
          strUnit[i2]="";
     }
         if(in.getLinkMan()!=null&&!in.getLinkMan().equals("")){
          strLinkMan[i2]=StringUtil.unicodeToUtf8(in.getLinkMan());
         }else {
          strLinkMan[i2]="";
     }
         if(in.getBusinessItems()!=null&& !in.getBusinessItems().equals("")){
         business[i2]=StringUtil.unicodeToUtf8(in.getBusinessItems());
         business[i2]=business[i2].replace("||", "\n");
         }else {
   business[i2]="";
  }
       
       //business[i2]=business[i2].replace("|", "\n");
        Log.v("business", business[i2]);
         strNO[i2]=in.getNo();
         i2++;
        }
        maxCount=strID.length;
  }
 
 
 
  /**
   * 创建菜单
   *
   */
 
    @Override
 public boolean onCreateOptionsMenu(Menu menu) {
     menu.add(Menu.NONE, Menu.FIRST+1, 5, "返回首页").setIcon(android.R.drawable.ic_menu_delete);
        menu.add(Menu.NONE, Menu.FIRST+2, 2, "退出").setIcon(android.R.drawable.ic_menu_edit);
         // this.getMenuInflater().inflate(R.menu.options_menu, menu);
  return true;
 }
   
   
  //菜单项被选择事件
       @Override
       public boolean onOptionsItemSelected(MenuItem item) {
           switch (item.getItemId()) {
           case Menu.FIRST + 1:
              Intent intent=new Intent(Copy_4_of_SalesOrderActivity.this,MainActivity.class);
              startActivity(intent);
               break;
           case Menu.FIRST + 2:
            Intent startMain = new Intent(Intent.ACTION_MAIN);
           startMain.addCategory(Intent.CATEGORY_HOME);
           startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
           startActivity(startMain);
           System.exit(0);
               break;
          
           }
           return false;
       }
      
      
 
       //定义自己的适配器,注意getCount和getView方法
       private class MyAdapter extends BaseAdapter{
           int count = 10 ;
         
     @Override
     public int getCount() {
      return count;
     }

     @Override
     public Object getItem(int position) {
      return position;
 
     }

     @Override
     public long getItemId(int position) {
      
      return position;
     }

     @Override
     public View getView(int position, View convertView, ViewGroup parent) {
        convertView=LayoutInflater.from(getApplicationContext()).inflate(R.layout.list_data, null);   
           TextView noTextView=(TextView)convertView.findViewById(R.id.ItemNO);
           noTextView.setText(strNO[position]);   
          TextView LinkManTextView=(TextView)convertView.findViewById(R.id.ItemLinkMan);
          LinkManTextView.setText(strLinkMan[position]); 
           TextView LinkTelTextView=(TextView)convertView.findViewById(R.id.ItemLinkTel);
          LinkTelTextView.setText(strLinkTel[position]); 
            TextView busTextView=(TextView)convertView.findViewById(R.id.Itembusiness1);
           busTextView.setText(business[position]);
           return convertView;
       }
   }
     
     
 @Override
 public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
      if(firstVisibleItem + visibleItemCount == totalItemCount){
       //开远程去下载网络数据
       if(mThread == null || ! mThread.isAlive()){
        mThread = new Thread(){
         @Override
         public void run() {
          try {
        //这里写网络数据请求的方法
           if(maxCount==0){
            addDeclaration();
           }
           
       } catch (Exception e) {
        e.printStackTrace();
       }
       
       Message message = new Message();
       message.what = 1;
       handler.sendMessage(message);
         }
        };
        mThread.run();
       }else {
     
     mThread.destroy();
    }
      }
  
 }
 @Override
 public void onScrollStateChanged(AbsListView view, int scrollState) {
    
  
 }  

 
 private Handler handler = new Handler(){
  @Override
  public void handleMessage(Message msg) {
   switch (msg.what) {
   case 1:
    Log.v("mMyAdapter.count", mMyAdapter.count+"");
    if(mMyAdapter.count < maxCount){
     
     if((maxCount - mMyAdapter.count) >10){
      mMyAdapter.count+=10;
     }else {
      mMyAdapter.count+= maxCount -mMyAdapter.count;
     }
     
     int currentPage = mMyAdapter.count / 10;
     //Toast.makeText(getApplicationContext(), "第"+currentPage +"页",Toast.LENGTH_LONG).show();
    }else {
     
     mListView.removeFooterView(loadingLayout);
     mThread.stop();
    }
    //重新刷新ListView的adapter里面数据
    mMyAdapter.notifyDataSetChanged();
    break;

   default:
    break;
   }
  }
 };
      
}

 

第二种:AsyncTask

package com.cnjmwl.scm.salesorder;
/**
 * 使用AsyncTask进行分页
 */
import java.util.ArrayList;


import com.cnjmwl.scm.MainActivity;
import com.cnjmwl.scm.R;

import com.cnjmwl.util.HttpUtil;
import com.cnjmwl.util.ReadXML;
import com.cnjmwl.util.StringUtil;

import android.app.Activity;

import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.GridView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.Spinner;
import android.widget.Toast;

import android.widget.TextView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.LinearLayout.LayoutParams;


import com.cnjmwl.scm.entity.*;
public class SalesOrderActivity extends Activity implements OnScrollListener{
 private ListView mListView;
 private MyAdapter mMyAdapter;
 LinearLayout loadingLayout;
    private int lastItem=0;
  /**
     * 设置布局显示属性
     */
    private LayoutParams mLayoutParams = new LinearLayout.LayoutParams(
            LinearLayout.LayoutParams.WRAP_CONTENT,
            LinearLayout.LayoutParams.WRAP_CONTENT);
    /**
     * 设置布局显示目标最大化属性
     */
    private LayoutParams FFlayoutParams = new LinearLayout.LayoutParams(
            LinearLayout.LayoutParams.FILL_PARENT,
            LinearLayout.LayoutParams.FILL_PARENT);

    private ProgressBar progressBar;
    private boolean isLoading;
   
   
  /**
   * 报检属性名称
   */
 String[] strID,strUnit,strStatus,strStatusDesc,strNO,strDate,strLinkMan,strLinkTel,business;
 int maxCount;//数据库中的订单总数
 
 ArrayList<SalesOrder> lists;
 View.OnClickListener cl;
   @Override
 protected void onCreate(Bundle savedInstanceState) {
  
  super.onCreate(savedInstanceState);
   setContentView(R.layout.order_main);
   setupViews();

 }
   public void setupViews(){
    if(maxCount==0){
     addDeclaration();
    }
   
  
    //线性布局
    LinearLayout layout=new LinearLayout(this);
    //设置布局水平方向
    layout.setOrientation(LinearLayout.HORIZONTAL);
    //进度条
    progressBar=new ProgressBar(this);
    //把进度条加入到layout中
    layout.addView(progressBar,mLayoutParams);
    //文本内容
    TextView textView=new TextView(this);
    textView.setText("加载中...");
    textView.setGravity(Gravity.CENTER_VERTICAL);
    //把文本加入到layout中
    layout.addView(textView,FFlayoutParams);
    //设置layout的重力方向,即对齐方式是
    layout.setGravity(Gravity.CENTER);
    //设置ListView的页脚layout
    loadingLayout = new LinearLayout(this);
    loadingLayout.addView(layout,mLayoutParams);
    loadingLayout.setGravity(Gravity.CENTER);
   
    //得到一个ListView用来显示条目
    mListView=(ListView)findViewById(R.id.listview);
   
    //添加到页脚
    mListView.addFooterView(loadingLayout);  
      mMyAdapter=new MyAdapter();
      mListView.setAdapter(mMyAdapter);
      mListView.setOnScrollListener(this);
      mListView.setTextFilterEnabled(true);
      mListView.setBackgroundResource(R.drawable.background);     
      
      
     }
 
  /**
      * 向服务器请求待办列表
      */
     private String queryList(String uri){
    String url = HttpUtil.BASE_URL+uri;
   System.out.println(url);
     return HttpUtil.getHTTPUtil().queryStringForPost(url);
   }
    
  public void addDeclaration(){
   String result2=queryList("orderStatusList".trim());
    lists=ReadXML.readXML(result2).getInspection2();
    Log.v("result2--", result2);
    strID=new String[lists.size()];
    strNO=new String[lists.size()];
    strStatus=new String[lists.size()];
    strStatusDesc=new String[lists.size()];
    strUnit=new String[lists.size()];
    strDate=new String[lists.size()];
    strLinkMan=new String[lists.size()];
    strLinkTel=new String[lists.size()];
    business=new String[lists.size()];
    int i2=0;
        for(SalesOrder in:lists){
         strID[i2]=in.getId();    
         strStatus[i2]=in.getStatus();
         strDate[i2]=in.getDate();
         strLinkTel[i2]=in.getLinkTel();
       
         //business[i2]=business[i2].replace("@", "\n");
       
         if(in.getStatusDesc()!=null&&!in.getStatusDesc().equals("")){
          strStatusDesc[i2]=StringUtil.unicodeToUtf8(in.getStatusDesc());
         }else {
     strStatusDesc[i2]="";
     }
         if(in.getUnit()!=null&&!in.getUnit().equals("")){
          strUnit[i2]=StringUtil.unicodeToUtf8(in.getUnit());
         }else {
          strUnit[i2]="";
     }
         if(in.getLinkMan()!=null&&!in.getLinkMan().equals("")){
          strLinkMan[i2]=StringUtil.unicodeToUtf8(in.getLinkMan());
         }else {
          strLinkMan[i2]="";
     }
         if(in.getBusinessItems()!=null&& !in.getBusinessItems().equals("")){
         business[i2]=StringUtil.unicodeToUtf8(in.getBusinessItems());
         business[i2]=business[i2].replace("||", "\n");
         }else {
   business[i2]="";
  }
       
       //business[i2]=business[i2].replace("|", "\n");
        Log.v("business", business[i2]);
         strNO[i2]=in.getNo();
         i2++;
        }
        maxCount=strID.length;
  }
 
 
 
  /**
   * 创建菜单
   *
   */
 
    @Override
 public boolean onCreateOptionsMenu(Menu menu) {
     menu.add(Menu.NONE, Menu.FIRST+1, 5, "返回首页").setIcon(android.R.drawable.ic_menu_delete);
        menu.add(Menu.NONE, Menu.FIRST+2, 2, "退出").setIcon(android.R.drawable.ic_menu_edit);
         // this.getMenuInflater().inflate(R.menu.options_menu, menu);
  return true;
 }
   
   
  //菜单项被选择事件
       @Override
       public boolean onOptionsItemSelected(MenuItem item) {
           switch (item.getItemId()) {
           case Menu.FIRST + 1:
              Intent intent=new Intent(SalesOrderActivity.this,MainActivity.class);
              startActivity(intent);
               break;
           case Menu.FIRST + 2:
            Intent startMain = new Intent(Intent.ACTION_MAIN);
           startMain.addCategory(Intent.CATEGORY_HOME);
           startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
           startActivity(startMain);
           System.exit(0);
               break;
          
           }
           return false;
       }
      
      
       //定义自己的适配器,注意getCount和getView方法
       private class MyAdapter extends BaseAdapter{
           int count = 10 ;
         
     @Override
     public int getCount() {
      return count;
     }

     @Override
     public Object getItem(int position) {
      return position;
     }

     @Override
     public long getItemId(int position) {
      return position;
     }

     @Override
     public View getView(int position, View convertView, ViewGroup parent) {
        convertView=LayoutInflater.from(getApplicationContext()).inflate(R.layout.list_data, null);
           TextView noTextView=(TextView)convertView.findViewById(R.id.ItemNO);
           noTextView.setText(strNO[position]);
          TextView LinkManTextView=(TextView)convertView.findViewById(R.id.ItemLinkMan);
          LinkManTextView.setText(strLinkMan[position]);
           TextView LinkTelTextView=(TextView)convertView.findViewById(R.id.ItemLinkTel);
          LinkTelTextView.setText(strLinkTel[position]);
            TextView busTextView=(TextView)convertView.findViewById(R.id.Itembusiness1);
           busTextView.setText(business[position]);
           return convertView;
       }
   }
     
     
 @Override
 public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
  Log.i("test", "Scroll>>>first: " + firstVisibleItem
    + ", visible: " + visibleItemCount + ", total: "
    + totalItemCount);
      lastItem = firstVisibleItem + visibleItemCount -1;
      Log.i("test", "Scroll>>>lastItem:" + lastItem);
      Log.i("mMyAdapter.count", mMyAdapter.count+"");
      Log.i("maxCount", maxCount+"");
      if(mMyAdapter.count < maxCount){
       if(firstVisibleItem + visibleItemCount == totalItemCount){
        //isLoading用于控制重复加载
        if(!isLoading){
         new MyTask().execute(null);
        }
       }
       
      }else {
    mListView.removeFooterView(loadingLayout);
   }
   
 }
 @Override
 public void onScrollStateChanged(AbsListView view, int scrollState) {
    
 }  

 
 
 private class MyTask extends AsyncTask<Void, Void, Void> {
  @Override
  protected void onPreExecute() {
   super.onPreExecute();
 
   isLoading =true;
  }
  @Override
  protected Void doInBackground(Void... params) {
   try {
    Thread.sleep(5000);
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
   
   if(mMyAdapter.count < maxCount){
    if((maxCount - mMyAdapter.count) >10){
     mMyAdapter.count+=10;
    }else {
     mMyAdapter.count+= maxCount -mMyAdapter.count;
    }
    
   }
   
   return null;
  }
  @Override
  protected void onPostExecute(Void result) {
   super.onPostExecute(result);
   mMyAdapter.notifyDataSetChanged();
   mListView.setSelection(lastItem);
   int currentPage = mMyAdapter.count / 10;
   Toast.makeText(getApplicationContext(), "第" + currentPage + "页",
     Toast.LENGTH_LONG).show();
  
   isLoading = false;
  }
 }
 
 
      
}


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值