ListView异步加载图片出现图片错位的解决方案

来源:互联网 发布:天意网络魔域一条龙 编辑:程序博客网 时间:2024/06/05 05:05
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);    }}
}
阅读全文
2 0
原创粉丝点击