实例效果:
后台逻辑:
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的展示