ListView数据分页实例

ListView分页
Activity中:
代码第一步:
private boolean isDivPage;//标示当前页数据是否加载完毕
private int 当前页码=1;

 lv.setOnScrollListener(new OnScrollListener() {
                        @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) {
                                if(isDivPage && OnScrollListener.SCROLL_STATE_IDLE==scrollState){
                    当前页码++;
                    启动AsyncTask根据当前页码再次请求网络获取数据;new xxAsyncTask().execute(...);
                }
            }

            @Override
            public void onScroll(AbsListView view, int firstVisibleItem,
                    int visibleItemCount, int totalItemCount) {
                isDivPage=((firstVisibleItem+visibleItemCount)==totalItemCount);
            }
        });

                /*  问题一:只显示当前页码对应的集合数据
                     *  
                     *  将pageIndex页码++后启动AsyncTask加载数据时 发现listView中只显示当前页的数据 之前
                     * 加载的数据不能展示  分析发现 因为AsyncTask中加载的数据集合onPostExecute()方法中只有
                     * 当前页数据  
                     *   解决方案:声明一个集合存储每页加载的数据集合  然后将总集合数据加载到适配器
                     */     

代码第二步:
Activity中:
private boolean isDivPage;//标示当前页数据是否加载完毕
private int 当前页码=1;
private List<与数据源中的集合泛型一致> totalList=new arraList<与数据源中的集合泛型一致>();

   lv.setOnScrollListener(new OnScrollListener() {

            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) {

                if(isDivPage && OnScrollListener.SCROLL_STATE_IDLE==scrollState){
                    当前页码++;
                    启动AsyncTask根据当前页码再次请求网络获取数据;new xxAsyncTask().execute(...);
                }
            }

            @Override
            public void onScroll(AbsListView view, int firstVisibleItem,
                    int visibleItemCount, int totalItemCount) {
                isDivPage=((firstVisibleItem+visibleItemCount)==totalItemCount);
            }
        }); 

网络下载AsyncTask
private List<与数据源中的集合泛型一致> totalList;
public 网络下载AsyncTask的构造函数(List<与数据源中的集合泛型一致> totalList….){
this.totalList=totalList;
}

   public void onPostExecute(List<实体类> result){
     if(result!=null && result.length!=0){
        totalList.**addAll**(reuslt);
        MyBaseAdapter adapter=new MyBaseAdapter(totalList...);
        lv.setAdapter(adapter);
     }
   }

问题二:每次加载下一页数据时 展示到listview中总是从第一页开始展示
原因:每次将当前页对应的集合加载到总集合中后,每次都是将总集合加载到适配器中
适配器加载展示数据时从总集合的第一条开始展示
解决:加载第一页时将数据源加载到适配器其后的页码只需要调用notifyDataSetChanged()方法提醒适配器改变即可
代码第三步:
Activity中:
private boolean isDivPage;//标示当前页数据是否加载完毕
private int 当前页码=1;
private List<与数据源中的集合泛型一致> totalList=new arraList<与数据源中的集合泛型一致>();
private MyBaseAdapter adapter;

onCreate(){
       ...
       adapter=new MyBaseAdapter(totalList....);
       ...
    }
    ...
   lv.setOnScrollListener(new OnScrollListener() {

            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) {

                if(isDivPage && OnScrollListener.SCROLL_STATE_IDLE==scrollState){
                    当前页码++;
                    启动AsyncTask根据当前页码再次请求网络获取数据;new xxAsyncTask().execute(...);
                }
            }

            @Override
            public void onScroll(AbsListView view, int firstVisibleItem,
                    int visibleItemCount, int totalItemCount) {
                isDivPage=((firstVisibleItem+visibleItemCount)==totalItemCount);
            }
        });         

网络下载AsyncTask
private List<与数据源中的集合泛型一致> totalList;
private int 当前页码;
private MyBaseAdapter adapter;

public 网络下载AsyncTask的构造函数(List<与数据源中的集合泛型一致> totalList,int 当前页码,MyBaseAdapter adapter….){
this.totalList=totalList;
this.当前页码=当前页码;
this.adapter=adapter;
}

   public void onPostExecute(List<实体类> result){
     if(result!=null && result.length!=0){
        totalList.addAll(reuslt);

        adapter.setList(totalList);

        if(当前页码==1){
           lv.setAdapter(adateter);
        }else{
           adapter.notifyDataSetChanged();
        }
     }
   }

MyBaseAdapter
   public void setList(List<实体类> list){
            this.list=list;
   }

场景一: 将图片下载展示

适配器中:

  public View getView(int position,View converView,ViewGroup parent){
       holder.iv.setImageResource(R.drawable.xx);
     String imageUrl=根据postision下标获取图片的地址;

     new 图片下载的AsyncTask(new CallBack(){
          public void sendBitmap(Bitmap bm){
              if(bm!=null){
                 holder.iv.setImageBitmap(bm);
              }
          }
     }).execute(imageUrl);
  }

下载图片的AsyncTask

 private CallBack cb;

  public 图片下载AsyncTask构造函数(..CallBack cb){
        this.cb=cb;
  } 

  public void onPostExecute(byte[] result){
     if(result!=null && result.length!=0){
        Bitmap bm=BitmapFactory.decodeByteArray(result, 0, result.length);
        cb.sendBitmap(bm);
     }
  }

 public interface CallBack{
    public void sendBitmap(Bitmap bm);
 } 

场景二: 通过Map集合对已经下载过的图片进行缓存 从而保证下载过的图片加载速度提高 提高用户体验

适配器中

 private Map<String,Bitmap> map=new HashMap<String,Bitmap>();
 public View getView(int position,View converView,ViewGroup parent){

     holder.iv.setImageResource(R.drawable.xx);
     String imageUrl=根据postision下标获取图片的地址;

     if(map.containsKey(imageUrl)){
         holder.iv.setImageBitmap(map.get(imageUrl));
     }else{
        new 图片下载的AsyncTask(new CallBack(){
              public void sendBitmap(Bitmap bm){
                  if(bm!=null){
                     holder.iv.setImageBitmap(bm);
                  }
              }
        }).execute(imageUrl);
     }

  }

下载图片的AsyncTask

 private CallBack cb;
  private Map<String,Bitmap> map;

  public 图片下载AsyncTask构造函数(..CallBack cb,Map<String,Bitmap> map){
        this.cb=cb;
        this.map=map;
  } 

 public void onPostExecute(byte[] result){
     if(result!=null && result.length!=0){
        Bitmap bm=BitmapFactory.decodeByteArray(result, 0, result.length);
        cb.sendBitmap(bm);
        map.put(图片的地址,bm);
     }
  }

 public interface CallBack{
    public void sendBitmap(Bitmap bm);
 } 

场景三: 通过给listview控件中每项item的imageview添加tag标记 解决图片错乱问题

适配器中

 private Map<String,Bitmap> map=new HashMap<String,Bitmap>();
 private ListView lv;
  public 适配器构造器(ListView lv){
      this.lv=lv;
  }

  public View getView(int position,View converView,ViewGroup parent){

     holder.iv.setImageResource(R.drawable.xx);
     String imageUrl=根据postision下标获取图片的地址;

     holder.iv.setTag(imageUrl);

     if(map.containsKey(imageUrl)){
         holder.iv.setImageBitmap(map.get(imageUrl));
     }else{
        new 图片下载的AsyncTask(new CallBack(){
              public void sendBitmap(Bitmap bm,String imagePath){
                  if(bm!=null){
                     holder.iv=(ImageView)lv.findViewWithTag(imagePath);
                     if(holder.iv!=null){
                        holder.iv.setImageBitmap(bm);
                     }
                  }
              }
        }).execute(imageUrl);
     }

  }

下载图片的AsyncTask

private CallBack cb;
  private Map<String,Bitmap> map;

public 图片下载AsyncTask构造函数(..CallBack cb,Map<String,Bitmap> map){
        this.cb=cb;
        this.map=map;
  } 

  public void onPostExecute(byte[] result){
     if(result!=null && result.length!=0){
        Bitmap bm=BitmapFactory.decodeByteArray(result, 0, result.length);
        cb.sendBitmap(bm,当前图片的下载路径);
        map.put(图片的地址,bm);
     }
  }

 public interface CallBack{
    public void sendBitmap(Bitmap bm,String imagePath);
 } 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值