实例代码:
package com.hsj.example.gridviewdemo01; import android.app.ProgressDialog; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.AsyncTask; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.AbsListView; import android.widget.ImageView; import android.widget.ListView; import android.widget.SimpleAdapter; import com.hsj.example.gridviewdemo01.com.hsj.utils.NetUtils; import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.ArrayList; import java.util.List; import java.util.Map; public class MainActivity extends AppCompatActivity { private ListView listView_movies; private String path; private ProgressDialog progressDialog; private List<Map<String,Object>> data=new ArrayList<>(); private SimpleAdapter adapter; private int pageNo=1; private int pageSize=20; /** * 是否滚到页面底部 */ private boolean isBottom; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); this.listView_movies= (ListView) this.findViewById(R.id.listView_movies); this.progressDialog=new ProgressDialog(this); this.progressDialog.setMessage("正在加载数据,请稍等....."); this.progressDialog.setCancelable(false); this.listView_movies.setOnScrollListener(new AbsListView.OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { if(isBottom && 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; new LoadNetDataAsyncTask().execute(path); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { isBottom=firstVisibleItem+visibleItemCount==totalItemCount; } }); try { path = "https://movie.douban.com/j/search_subjects?type=movie&tag="+ URLEncoder.encode("热门","utf-8")+"&sort=recommend&page_limit=20&page_start=0"; new LoadNetDataAsyncTask().execute(path); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } /** * 加载网络数据的 */ private final class LoadNetDataAsyncTask extends AsyncTask<String,Void,List<Map<String,Object>>>{ @Override protected void onPreExecute() { progressDialog.show(); } @Override protected List<Map<String, Object>> doInBackground(String... params) { try { InputStream inputStream= NetUtils.getInputStreamByPath(params[0]); if(inputStream!=null){ String json=NetUtils.getJsonByInputStream(inputStream); if(json!=null){ return NetUtils.getListMaps(json); } } } catch (Exception e) { e.printStackTrace(); } return null; } @Override protected void onPostExecute(List<Map<String, Object>> maps) { if(maps.size()>0){ data.addAll(maps); if(adapter==null){ adapter=new SimpleAdapter(MainActivity.this, data, R.layout.movie_item, new String[]{"title","cover"}, new int[]{R.id.textView_title,R.id.imageView_cover}); /* 给用户一次机会:手工将指定数据绑定到指定控件上的机会 */ adapter.setViewBinder(new SimpleAdapter.ViewBinder() { /** * 当给控件赋值时自动调用的方法 * @param view 需要绑定数据的视图对象 * @param data 需要给视图设置的数据 * @param textRepresentation 需要给视图设置的数据 * @return 如果使用setViewValue()方法完成数据绑定则返回true,否则使用默认的数据绑定则返回false */ @Override public boolean setViewValue(View view, Object data, final String textRepresentation) { if(view instanceof ImageView){ final ImageView imageView_cover= (ImageView) view; class LoadImageSyncTask extends AsyncTask<String,Void,Bitmap>{ @Override protected Bitmap doInBackground(String... params) { try { InputStream inputStream=NetUtils.getInputStreamByPath(textRepresentation); if(inputStream!=null){ return BitmapFactory.decodeStream(inputStream); } } catch (Exception e) { e.printStackTrace(); } return null; } @Override protected void onPostExecute(Bitmap bitmap) { if(bitmap!=null){ imageView_cover.setImageBitmap(bitmap); } } } new LoadImageSyncTask().execute(textRepresentation); return true; } System.out.println("====setViewValue(View view="+view+", Object data="+data+", String textRepresentation="+textRepresentation+")===="); return false; } }); listView_movies.setAdapter(adapter); }else{ adapter.notifyDataSetChanged(); } } progressDialog.dismiss(); } } }