private XListView xlistview; private int index = 1; /** * listview中view复用并异步加载图片时,有可能滚出屏幕的图片加载过慢, * 导致回收利用的view会显示前面还没有加载完的图片,这样就出现了图片错位 */ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); xlistview = (XListView) findViewById(R.id.xlistview); getData("http://apis.juhe.cn/cook/query.php", index + "", "20"); } private void getData(String path, String pn, String rn) { new AsyncTask<String, Void, String>() { @Override protected void onPostExecute(String s) { super.onPostExecute(s); if (s != null) { System.out.println("请求到的数据+" + s); Gson gson = new Gson(); MenuInfo info = gson.fromJson(s, MenuInfo.class); List<MenuInfo.ResultBean.DataBean> list = info.getResult().getData(); MyBaseAdapter adapter = new MyBaseAdapter(list, MainActivity.this); xlistview.setAdapter(adapter); } } @Override protected String doInBackground(String... params) { try { String path = params[0]; String pn = params[1]; String rn = params[2]; URL url = new URL(path); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("POST"); connection.setConnectTimeout(5000); connection.setReadTimeout(5000); OutputStream os = connection.getOutputStream(); os.write(("menu=猪肉炖粉条&key=XXXXXXXXXX&pn=" + pn + "&rn=" + rn).getBytes()); os.flush(); os.close(); if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) { InputStream is = connection.getInputStream(); return StringTools.getJson(is); } } catch (Exception e) { e.printStackTrace(); } return null; } }.execute(path, pn, rn); }
public class MyBaseAdapter extends BaseAdapter { private List<MenuInfo.ResultBean.DataBean> list; private Context context; public MyBaseAdapter(List<MenuInfo.ResultBean.DataBean> list, Context context) { this.list = list; this.context = context; } @Override public int getCount() { return list != null ? list.size() : 0; } @Override public Object getItem(int position) { return list.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = null; if (convertView == null) { convertView = View.inflate(context, R.layout.item, null); holder = new ViewHolder(); holder.img = (ImageView) convertView.findViewById(R.id.img); holder.tv = (TextView) convertView.findViewById(R.id.textview); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.tv.setText(list.get(position).getIngredients()); // 为了解决图片错位,预先加载一个标签 holder.img.setTag(list.get(position).getAlbums().get(0)); // 自定义方法设置图片 setImageView(holder.img, position, list.get(position).getAlbums().get(0)); // 为了解决图片错位,设置完图片以后把图片设置成空,或者设置成默认图片 holder.img.setImageResource(R.mipmap.loading); return convertView; } class ViewHolder { ImageView img; TextView tv; } private void setImageView(final ImageView img, int position, final String path) { new AsyncTask<String, Void, Bitmap>() { @Override protected void onPostExecute(Bitmap bitmap) { super.onPostExecute(bitmap); if (bitmap != null) { // 为了解决图片错位, 判断一下这里的图片路劲和我们之前设置的图片的Tag的路劲是否一样 // 如果一样就加载图片,如果不一样就不加载,就不会造成图片错位 if (img.getTag() != null && path.equals(img.getTag())) img.setImageBitmap(bitmap); } else { img.setImageResource(R.mipmap.ic_launcher_round); } } @Override protected Bitmap doInBackground(String... params) { try { URL url = new URL(params[0]); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.setConnectTimeout(5000); connection.setReadTimeout(5000); if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) { InputStream is = connection.getInputStream(); return BitmapFactory.decodeStream(is); } } catch (Exception e) { e.printStackTrace(); } return null; } }.execute(path); } }}