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);
}