实例效果:
后台逻辑:
package com.hsj.example.paginationloadnetdatademo02; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.AsyncTask; import android.os.Bundle; import android.os.SystemClock; import android.support.v7.app.AppCompatActivity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AbsListView; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; import com.hsj.example.paginationloadnetdatademo02.com.hsj.domain.Movie; import com.hsj.example.paginationloadnetdatademo02.com.hsj.utils.Utils; import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity { private ListView listView_movies; private MyAdapter adapter; private String path; private int pageNo=1; private int pageSize=20; //总数据源 private List<Movie> data=new ArrayList<>(); // 存放最后一个可见条目的索引值 private int lastVisibleItem; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); this.listView_movies= (ListView) this.findViewById(R.id.listView_movies); View footerView=View.inflate(this,R.layout.footer_view,null); this.listView_movies.addFooterView(footerView); this.listView_movies.setOnScrollListener(new AbsListView.OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { if(lastVisibleItem==adapter.getCount() && scrollState== AbsListView.OnScrollListener.SCROLL_STATE_IDLE){ pageNo++; try { path = "https://movie.douban.com/j/search_subjects?type=movie&tag="+ URLEncoder.encode("热门","utf-8")+"&sort=recommend&page_limit="+pageSize+"&page_start="+(pageNo-1)*pageSize; } catch (UnsupportedEncodingException e) { e.printStackTrace(); } new LoadNetDataAsyncTask().execute(path); } } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { lastVisibleItem=firstVisibleItem+visibleItemCount-1; } }); try { path = "https://movie.douban.com/j/search_subjects?type=movie&tag="+ URLEncoder.encode("热门","utf-8")+"&sort=recommend&page_limit="+pageSize+"&page_start="+(pageNo-1)*pageSize; new LoadNetDataAsyncTask().execute(path); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } private final class LoadNetDataAsyncTask extends AsyncTask<String,Void,List<Movie>>{ @Override protected List<Movie> doInBackground(String... params) { try { InputStream inputStream=Utils.getInputStreamByPath(params[0]); if(inputStream!=null){ String json=Utils.getStringByInputStream(inputStream); SystemClock.sleep(3000); return Utils.getListMovies(json); } } catch (Exception e) { e.printStackTrace(); } return null; } @Override protected void onPostExecute(List<Movie> movies) { if(movies!=null){ //将当前页的数据添加到大集合中 data.addAll(movies); if(adapter==null){ adapter=new MyAdapter(data); listView_movies.setAdapter(adapter); }else{ //更新界面 adapter.notifyDataSetChanged(); } } } } private final class MyAdapter extends BaseAdapter{ private List<Movie> movies; private LayoutInflater layoutInflater; private ViewHolder viewHolder=null; public MyAdapter(List<Movie> movies) { this.movies=movies; layoutInflater=LayoutInflater.from(MainActivity.this); } @Override public int getCount() { return movies.size(); } @Override public Object getItem(int position) { return movies.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { Movie movie= movies.get(position); final String cover=movie.getCover(); if(convertView==null){ viewHolder=new ViewHolder(); //将布局文件转换成View 对象 convertView=layoutInflater.inflate(R.layout.movie_item,null); viewHolder.imageView_cover= (ImageView) convertView.findViewById(R.id.imageView_cover); viewHolder.textView_title= (TextView) convertView.findViewById(R.id.textView_title); convertView.setTag(viewHolder); }else{ viewHolder= (ViewHolder) convertView.getTag(); } viewHolder.imageView_cover.setTag(cover); class LoadImageAsyncTask extends AsyncTask<String,Void,Bitmap>{ @Override protected Bitmap doInBackground(String... params) { try { InputStream inputStream=Utils.getInputStreamByPath(params[0]); if(inputStream!=null){ return BitmapFactory.decodeStream(inputStream); } } catch (Exception e) { e.printStackTrace(); } return null; } @Override protected void onPostExecute(Bitmap bitmap) { if(bitmap!=null){ Object localUrl=viewHolder.imageView_cover.getTag(); if(localUrl!=null && cover.equals(localUrl)){ viewHolder.imageView_cover.setImageBitmap(bitmap); } } } } new LoadImageAsyncTask().execute(cover); viewHolder.textView_title.setText(movie.getTitle()); return convertView; } } class ViewHolder{ ImageView imageView_cover; TextView textView_title; } }
前台展示:
<1>一个movie_item展示
<2>一个footer_view展示
<3>一个activity_xml的展示