文档章节

ListView的分页 复用convertView

火文乐武
 火文乐武
发布于 2016/04/28 21:08
字数 1171
阅读 28
收藏 3

(一)ListView的分页
  分页的必要性:实际开发中数据量往往都比较大  一次查询太多数据 效率比较低 界面也无法展示那么多数据。
  使用分页展示数据
  http://1000phone.net:8088/app/iAppFree/api/free.php?page=1&number=20
  1.pageIndex     url里面的page  想要展示第几页数据
  2.pageSize      url里面的number 每页展示几条数据
 
  url地址的规范  地址与参数之间使用?隔开    多个参数之间用&(&&)隔开
 
  使用按钮分页:  上一页 下一页 两个按钮
        当点击下一页的时候  重新使用MyAsyncTask查询网络数据
       
  滚动分页:1.给listView添加滚动的监听事件  理解监听事件中的两个方法
 
          给listView添加滚动的监听事件 当我们鼓动listView的时候 它有三种状态
            public static int SCROLL_STATE_IDLE = 0; //停顿的
            public static int SCROLL_STATE_TOUCH_SCROLL = 1; //触摸滚动
            public static int SCROLL_STATE_FLING = 2;  //猛冲  
    
  滑动到末尾加载新数据的条件
  1、当状态是SCROLL_STATE_IDLE (停顿的时候)加载新数据
  2、滑动最底部
     //firstVisibleItem    第一个可见条目 (position)
     //visibleItemCount    可见的条目总数
     //totalItemCount      总条目数
     当第一条可见+ 可见的条目总数  =  总条目数 意味着滑动到最底部

(二)解决复用convertView出现的一些问题
    例如:复选框选择错位 图片加载错位

编写
  activity_main.xml  添加一个ListView
  MainActivity.java  适配器控件使用的五个步骤
  MyAdapter
            getCount()
            getView();    
                条目布局        
                ViewHolder
                
  MyAsyncTask
            doInBackgroud()  
                HttpUtils
            onPostExecute()
                JsonUtils
                
  ImageAsyncTask    
            doInBackgroud()  
                HttpUtils
            onPostExecute()
                imageView.setImageBitmp(bm);
                
    注意: ImageAsyncTask写完之后是在自定义适配器(MyAdapter)中调用


    分页:
    1.listView添加监听器  实现两个对滚动监听的方法
    2.根据两个方法的参数在适当的时候重新加载下一页的数据
    3.添加footerView




ListView 进行数据切换  
        思路 :创建两个适配器


AsyncTask 1.5  串行操作
AsyncTask 2.   并行操作
AsyncTask 4    串行(默认)+并行


回顾
getView(); 会被调用很多
每调用一次都需要创建一个条目布局(View对象)
优化ListView
1.listView的布局 宽和高 都是填充父窗体
2.复用convertView
  convertView是getView方法的一个参数   convertView复用废弃view对象
   使用convertView的好处是复用已经退出屏幕的view对象  而不是重新新的view对象
3.ViewHolder
    ViewHolder的好处  减少findViewById的查找次数
    使用的步骤
    1.第一次加载的时候把查找的控件存到ViewHolder的对象中
    2.把ViewHolder的对象放入convertView中
    3.convertView取出ViewHolder的对象 ,然后从ViewHolder的对象中取出控件对象

当代码量比较多的时候  多去记忆过程(代码运行的流程和步骤)    
第三个例子

package com.qf.day09_listview03;
public class MainActivity extends Activity {
    List<Game> data;
    MyAdapter adapter;
    boolean flag = false;
    int pageIndex = 1;
    View footView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //1.
        ListView listView = (ListView) findViewById(R.id.lv);
        //2.
        data = new ArrayList<>();
        //3.
        adapter = new MyAdapter(MainActivity.this,data);
        
        footView = getLayoutInflater().inflate(R.layout.footer, null);
        listView.addFooterView(footView);
        
        //4.
        listView.setAdapter(adapter);
        //5.
        new MyAsyncTask(MainActivity.this,data,adapter)
                .execute("http://1000phone.net:8088/app/iAppFree/api/free.php?page="+pageIndex+"&number=20");
        
        listView.setOnScrollListener(new OnScrollListener() {
            
            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) {
                    if(flag == true && scrollState == OnScrollListener.SCROLL_STATE_IDLE){
                        pageIndex = pageIndex + 1;
                        new MyAsyncTask(MainActivity.this,data,adapter)
                            .execute("http://1000phone.net:8088/app/iAppFree/api/free.php?page="+pageIndex+"&number=20");
                    }
            }
            
            @Override
            public void onScroll(AbsListView view, int firstVisibleItem,
                    int visibleItemCount, int totalItemCount) {
                    if( firstVisibleItem + visibleItemCount  ==  totalItemCount ){
                            flag = true;
                    }else{
                            flag = false;
                    } }
             });   
    }

}

package com.qf.day09_listview03;
public class MyAdapter extends BaseAdapter{
    Context context;
    List<Game> data;
    
    Map<String,Bitmap> cacheImage  = new HashMap<>();//用来存储已经浏览过的图片
    
    public MyAdapter(Context context, List<Game> data) {
        super();
        this.context = context;
        this.data = data;
    }
    @Override
    public int getCount() {
        return data.size();
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if(convertView == null){
            convertView = View.inflate(context, R.layout.item01, null);
            
            holder = new ViewHolder();
            holder.imageView = (ImageView) convertView.findViewById(R.id.item_iv);
            holder.textView = (TextView) convertView.findViewById(R.id.item_tv);
            
            convertView.setTag(holder);
        }else{
            holder = (ViewHolder) convertView.getTag();
        }
        Game game = data.get(position);
        holder.textView.setText(game.name);
        holder.imageView.setTag(game.iconUrl);
        
        if(cacheImage.containsKey(game.iconUrl)){//从缓存中读取图片
            holder.imageView.setImageBitmap(cacheImage.get(game.iconUrl));
        }else{//如果缓存中不存在该图片则访问网络获取图片
            //设置一个预览图片
            holder.imageView.setImageResource(R.drawable.logo);
            
            new ImageAsyncTask(context, holder.imageView,position,game.iconUrl,cacheImage)
            //.execute(game.iconUrl);
            //子线程并行执行
            .executeOnExecutor(Executors.newFixedThreadPool(1), game.iconUrl);
        }  
        return convertView;
    }
    class ViewHolder{
        ImageView imageView;
        TextView textView;
    }
    //--------------------------------------------------------------------
    @Override
    public Object getItem(int position) {
        return null;
    }
    @Override
    public long getItemId(int position) {
        return 0;
    }
    
}
package com.qf.day09_listview03;import java.util.List;
import android.content.Context;import android.os.AsyncTask;
import android.widget.Toast;
public class MyAsyncTask extends AsyncTask<String, Void, byte[]>{    Context context;  
  List<Game> data;   
   MyAdapter adapter;       
 public MyAsyncTask(Context context, List<Game> data, MyAdapter adapter) {       
  super(); 
   this.context = context;      
    this.data = data;       
     this.adapter = adapter;    
     }   
 @Override    
protected byte[] doInBackground(String... params) {     
   return HttpUtils.getData(params[0]);    }     
@Override   
protected void onPostExecute(byte[] result) {        
super.onPostExecute(result);       
 if(result != null){            
 String jsonString = new String(result);          
   List<Game> data2 = JsonUtils.parseJson(jsonString);                    
       data.addAll(data2);          
         adapter.notifyDataSetChanged();     
          }else{          
            Toast.makeText(context, "网络异常", Toast.LENGTH_SHORT).show();       
             }    }        }
package com.qf.day09_listview03;
public class JsonUtils {
    public static List<Game> parseJson(String jsonString) {
        List<Game> data2 = new ArrayList<>();
        try {
            JSONObject obj1 = new JSONObject(jsonString);
            JSONArray array = obj1.getJSONArray("applications");
            Game game;
            for(int i=0;i<array.length();i++){
                    JSONObject obj2 = array.getJSONObject(i);
                    game = new Game();
                    game.name = obj2.getString("name");
                    game.iconUrl = obj2.getString("iconUrl");
                    data2.add(game);
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return data2;
    }
}


© 著作权归作者所有

共有 人打赏支持
火文乐武
粉丝 7
博文 38
码字总数 17183
作品 0
郑州
Android工程师
私信 提问
Android第四十天

1、ListView分页加载 <1>分页的作用 (1)避免一次性加载过多内容时,造成内存溢出; (2)可以增强用户体验。 <2>实现思路 (1)当滚动到最后一条的时候,加载新数据; (2)适配器的数据源...

黄晓磊
2016/07/23
24
0
如何流畅加载十万张图片显示(磨砺营马剑威Android)

【威哥说】Android开发最注重的是性能。所以一个图片的加载,一个按钮功能的实现都关系到最终项目的好与坏。希望每一个小伙伴能利用自己的时间充分的学习。只有在不断的学习中,才能把握更多...

磨砺营
2016/08/31
28
0
如何优化ListView的性能

1.简单陈述使ListView滑动流畅的方式 (1)重用ConvertView;(在Adapter中的getView方法中,当ConvertView为空,使View对象可复用) (2)使用ViewHolder模式;(在Adapter中,先写一个静态...

Vicky馨予
2017/05/18
0
0
Android关于ListView的优化

当使用自定义Adapter来创建ListView时,注意以下几点,可以起到优化的作用: 在XML文件布局ListView时,android:layoutheight不要定义为wrapcontent,并且ListView的所有父节点布局的android...

小牛仔
2015/01/13
0
0
Android性能优化之Listview(ViewHolder重用机制)

相信大家在很多时候都会用到ListView这个控件,因为确实是用的很多很多,但是有木有遇到过当数据很多很多的时候,往下滑ListView时有时候会卡顿,这就需要我们来优化它了。 ListView优化主要...

u010687392
2015/05/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

JDK 12又来了,我学不动了...

写在前面 看到 JDK 12又发布了,萌新不知不觉感觉瑟瑟发抖,从 Java 1.8的函数式编程思维和范式 到 Java 1.9的模块化特性的加持 以及还没来得及深切感受一下 Java 1.11 的 ZGC强大之后,这次...

CodeSheep
54分钟前
12
0
解决在gradle构建project时,发生peer not authenticated错误的方法

问题: FAILURE: Build failed with an exception.* What went wrong:Could not resolve all dependencies for configuration ':wl01-service:compile'.> Could not resolve com.ali......

Benz001
今天
2
0
Apache Ignite上的TensorFlow

任何深度学习都是从数据开始的,这是关键点。没有数据,就无法训练模型,也无法评估模型质量,更无法做出预测,因此,数据源非常重要。在做研究、构建新的神经网络架构、以及做实验时,会习惯...

李玉珏
今天
18
0
Java记录日志附带请求标识

起因 系统是web接口服务,排查故障的时候经常需要记录某次请求调用链路日志。这样我们拉日志的时候只要匹配这个traceid就行了 第一版解决方案 原来我们一直用了个很low的办法,在请求开始的时...

Tree
今天
4
0
使用split_size优化的ODPS SQL的场景

使用split_size优化的ODPS SQL的场景 首先有两个大背景需要说明如下: 说明1:split_size,设定一个map的最大数据输入量,单位M,默认256M。用户可以通过控制这个变量,从而达到对map端输入的...

阿里云官方博客
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部