个人记录1-解决listview异步加载图片错位,滑动listview错乱抖动的问题

来源:互联网 发布:淘宝竹筒粽子的竹筒 编辑:程序博客网 时间:2024/05/19 19:55

项目中遇到的问题记录1:

参考博客:

http://blog.csdn.net/cike110120/article/details/8976169 

http://www.cnblogs.com/lesliefang/p/3619223.html (关于listview错位的原因分析)


为什么会出现图片错位的问题呢?一般是重用了convertView导致的。如果你重用了convertView,此时convertView中的ImageViewid值是相等的,而我们在设置ImageView的图片时,是根据id来设置的,此时就出现了图片错位问题。这里童鞋们可以自己去测试一下,不重用convertView,也就是每次getView的时候,都使用findViewById(R.id.xx)去得到每一个ItemImageView,异步下载图片的方法也只是简单的开一个AsyncTask执行下载。在这种情况下,图片一般是不会产生错位的。原因很简单,认真读一读前面的内容就明白了。但是你如果真的在使用这种方法来使用getView的话,并且图片量比较大的时候,你程序的性能肯定不会好到哪里去了。因此,重用convertView还是很有必要的。


listview异步加载网络图片代码:

public class TaskListViewAdapter extends BaseAdapter {private Context context;private List<Map<String, Object>> Items;private LayoutInflater inflater;public Bitmap ImageBitmap = null;private ListView listview;// context:上下文参数// Items:list数据源集合// listview:使用该adapter的listview对象public TaskListViewAdapter(Context context, List<Map<String, Object>> Items, ListView listview) {this.context = context;this.Items = Items;this.listview = listview;}@Overridepublic int getCount() {return Items == null ? 0 : Items.size();}@Overridepublic Object getItem(int position) {return Items.get(position);}@Overridepublic long getItemId(int position) {return position;}/** * 为什么会出现图片错位的问题呢?一般是因为重用了convertView导致的。 * 如果你重用了convertView,此时convertView中imageview的id值是相等的, * 而我们在设置imageview的图片时,是根据id来进行设置的,此时就出现了图片错位 * 如果不使用convertView重用,那么每次getview的时候都要使用findViewById()去得到每个item的imageview * 异步下载图片的方法也只是简单的开了一个AsyncTask执行下载,这样虽然不会发生错位,但是性能会很差 * http://blog.csdn.net/cike110120/article/details/8976169 * http://www.cnblogs.com/lesliefang/p/3619223.html */@Overridepublic View getView(int position, View convertView, ViewGroup parent) {// 解决图片错乱,乱闪的情况ViewHolder holder;Map<String, Object> Item = Items.get(position);inflater = LayoutInflater.from(context);if (convertView == null) {convertView = inflater.inflate(R.layout.tasklistview, null);holder = new ViewHolder();holder.PlantingCategory = (TextView) convertView.findViewById(R.id.PlantingCategory);holder.CompanyName = (TextView) convertView.findViewById(R.id.CompanyName);holder.PlantingRequirment = (TextView) convertView.findViewById(R.id.PlantingRequirment);holder.imageview = (ImageView) convertView.findViewById(R.id.imageview);// 设置图片的唯一标识// convertView的复用convertView.setTag(holder);} else {// findViewById的复用holder = (ViewHolder) convertView.getTag();}// 获得图片网址final String imagepath = new URLPATH().urlpath + "/Farm/" + Item.get("ImagePath");// TaskID唯一的标识final String TaskID = Item.get("TaskID") + "";Log.i("Log.i", "TaskListViewAdapter:imagepath:" + imagepath);// 设置图片的唯一标识holder.imageview.setTag(Item.get("TaskID"));holder.PlantingCategory.setText(Item.get("PlantingCategory") + "");// 任务要求holder.CompanyName.setText(Item.get("CompanyName") + "");// 公司名字holder.PlantingRequirment.setText(Item.get("PlantingRequirment") + "");// 种植要求// 异步加载网络图片// 耗时任务new AsyncTask<String, Void, Bitmap>() {// 下载图片@Overrideprotected Bitmap doInBackground(String... params) {// 使用网络连接类HttpClient类王城对网络数据的提取HttpClient httpClient = new DefaultHttpClient();HttpGet httpGet = new HttpGet(params[0]);Bitmap bitmap = null;try {HttpResponse httpResponse = httpClient.execute(httpGet);// 请求成功if (httpResponse.getStatusLine().getStatusCode() == 200) {HttpEntity httpEntity = httpResponse.getEntity();byte[] data = EntityUtils.toByteArray(httpEntity);bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);} else {Log.i("Log.i", "请求图片资源失败!!!!");}} catch (Exception e) {// TODO: handle exception}return bitmap;}@Overridepublic void onPostExecute(Bitmap result) {if (result != null) {// 我们使用findViewWithTag(TaskID)// 来找到ListView中对应的ImagView,然后给该ImageView设置图片即可ImageView imageview = (ImageView) listview.findViewWithTag(TaskID);imageview.setImageBitmap(result);imageview.setTag("");}}}.execute(imagepath);return convertView;}static class ViewHolder {public TextView PlantingCategory;public TextView CompanyName;public TextView PlantingRequirment;public ImageView imageview;}/** * 添加数据列表项 *  * @param newsitem */public void addNewItem(Map<String, Object> Item) {Items.add(Item);}}



1 0
原创粉丝点击