android listview 异步加载问题 android listview异步加载 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你用imageLoader这个三方开源库试试。 现在关键是滑动后 重新getview时 图片加载不出来 看一下你imageview控件设的是src还是background。或者试试把bitmap转成drawable,再setbackground试试 src,转了drawable也是这样耶 好奇怪 @Override public View getView(final int position, View convertView, ViewGroup parent) { holder = null; if (convertView == null) { holder = new ViewHolder(); convertView = mInflater.inflate(R.layout.class_home_item, null); holder = new ViewHolder(); holder.home_gd_rl = (RelativeLayout) convertView .findViewById(R.id.home_gd_rl); holder.msg_title_rl = (RelativeLayout) convertView .findViewById(R.id.home_item_title_rl); holder.userIcon = (ImageView) convertView .findViewById(R.id.home_item_user_iv); holder.msgTime = (TextView) convertView .findViewById(R.id.home_item_time); holder.msgTitle = (TextView) convertView .findViewById(R.id.home_item_title); holder.iv_msg_type = (ImageView) convertView .findViewById(R.id.iv_msg_type); holder.content_ll = (LinearLayout) convertView .findViewById(R.id.home_item_content_rl); holder.image_rl = (RelativeLayout) convertView .findViewById(R.id.image_rl); holder.msgImage = (ImageView) convertView .findViewById(R.id.home_item_content_iv); holder.msgImage_gridview = (GridView) convertView .findViewById(R.id.home_iv_grid); holder.msgContent_rl = (RelativeLayout) convertView .findViewById(R.id.content_text_rl); holder.msgContent = (TextView) convertView .findViewById(R.id.home_item_content); holder.comment_rl = (RelativeLayout) convertView .findViewById(R.id.feed_item_layout_comment); holder.praise_rl = (RelativeLayout) convertView .findViewById(R.id.feed_item_layout_praise); holder.comment_nub = (TextView) convertView .findViewById(R.id.comment_nub_tv); holder.praise_iv = (ImageView) convertView .findViewById(R.id.praise_iv); holder.msg_iv_pr = (ProgressBar) convertView .findViewById(R.id.progressBar1); // 点赞别表 holder.praise_list_rl = (LinearLayout) convertView .findViewById(R.id.praise_list_rl); holder.praise_first = (TextView) convertView .findViewById(R.id.tv_praise_first); holder.praise_second = (TextView) convertView .findViewById(R.id.tv_praise_second); holder.praise_third = (TextView) convertView .findViewById(R.id.tv_praise_thrid); holder.praise_sub1 = (TextView) convertView .findViewById(R.id.tv_praise_text_1); holder.praise_number = (TextView) convertView .findViewById(R.id.tv_praise_text_2); holder.praise_sub2 = (TextView) convertView .findViewById(R.id.tv_praise_text_3); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } msg = messageList.get(position); // 有图片的动态 if (msg.getOPImageList().size() == 0) { holder.msgImage.setVisibility(View.GONE); holder.msgImage_gridview.setVisibility(View.GONE); holder.home_gd_rl.setVisibility(View.GONE); holder.msg_iv_pr.setVisibility(View.GONE); holder.image_rl.setVisibility(View.GONE); } else if (msg.getOPImageList().size() == 1) { holder.image_rl.setVisibility(View.VISIBLE); holder.msgImage_gridview.setVisibility(View.GONE); holder.home_gd_rl.setVisibility(View.GONE); Image_url = new StringBuffer(AppConstant.DOWNLOAD_IMAGE_URL) .append(msg.getOPImageList().get(0).getImageUrl()) .toString(); ImageView imageView = holder.msgImage; Bitmap cachedImage = fengle.loadDrawable(context, Image_url, new ImageCallback() { @Override public void imageLoaded(Bitmap imageDrawable, String imageUrl) { ImageView imageViewByTag = (ImageView) listview .findViewWithTag(imageUrl); Log.i("test", "Drawable cachedImage = asyncImageLoader.loadDrawable( )-->"); if (imageViewByTag != null && imageDrawable != null) { // 防止图片url获取不到图片是,占位图片不见了的情况 imageViewByTag.setImageBitmap(imageDrawable); } } }); if (cachedImage == null) { holder.msgImage.setImageResource(R.drawable.pic_bg); } else { holder.msgImage.setImageBitmap(cachedImage); } } else { // 多张图片 holder.image_rl.setVisibility(View.GONE); holder.home_gd_rl.setVisibility(View.VISIBLE); holder.home_gd_rl.setFocusable(false); holder.msgImage.setVisibility(View.GONE); holder.msgImage_gridview.setVisibility(View.VISIBLE); holder.msg_iv_pr.setVisibility(View.GONE); holder.msgImage_gridview.setFocusable(false); } if (isCanClick.get(position) == false) { holder.praise_iv.setImageDrawable(context.getResources() .getDrawable(R.drawable.dashboard_recommand_off_default)); } else { holder.praise_iv.setImageDrawable(context.getResources() .getDrawable(R.drawable.dashboard_recommand_on_default)); } holder.comment_rl.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Log.e("", "////////////////////"); } }); holder.praise_rl.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { current_position = position; praiseSubmit(); } }); holder.msgTitle.setText(msg.getUserName()); StringBuffer str = new StringBuffer(msg.getActivityDate()); String create_time = str.append(" " + msg.getActivityTime()).toString(); holder.msgTime.setText(create_time); holder.msgContent.setText(msg.getUserActivityString()); initPraiseView(); if (msg.getOPCommentsList().size() == 0) { holder.comment_nub.setText(""); } else { holder.comment_nub.setText(String.valueOf(msg.getOPCommentsList() .size())); } holder.content_ll.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { } }); return convertView; } holder = new ViewHolder();这一步有重复了,但不是这个的问题 删代码的时候忘删了 你试试AsyncImage这个第三方开源库 我决定不是异步加载图片的问题, 我debug了一下 不管用到什么方式 回调还是AsyncTask,都会进到最后setimagebitamp这一步可是图片就是加载不出来一般在文件中的图片读取也还是挺快的呀第一次是能加载的 滑动后就怎么都加载不出来本人很菜 也不知道哪里出了问题 ImageView imageViewByTag = (ImageView) listview .findViewWithTag(imageUrl); 问题应该在这一句 你这个搜索 只会找到第一个TAG 是imageUrl的控件。 可能并不是你的要更新的控件。比如 你setTAG了 , listView 会重用item的, 在 msg.getOPImageList().size()=0 时候 还是有这个tag。 然后你find的结果就是这个contentView里面的,不是你要更新的那个ImageView。 这个代码中 在 ImageCallBack 接口中 吧imageUrl 回传回来,跟imageView.getTag() 进行比较,应该可以解决问题。试试看。 找到错误的原因了 在这个else if (msg.getOPImageList().size() == 1) { holder.image_rl.setVisibility(View.VISIBLE); holder.msgImage_gridview.setVisibility(View.GONE); holder.home_gd_rl.setVisibility(View.GONE);里加上 image.setvisibility(view.visible)就行了 感谢各位大神的建议和指导哈 目前问题已经解决了差了一个imageview 的显示(好坑啊)谢谢各位了 android 支持内核加载模块么 Android 2.3.x下,基于OpenGL的程序多次切来切去报EGL_BAD_ALLOC错误 SQLite小小疑问 R cannot be resolved to a variable 布局的理念是不是类同的? apk在真机上运行不了 资源 请教音乐与歌词同步如何实现 作业帮技术 使用sqlite报SQLiteReadOnlyDatabaseException异常 数据库操作的异常Cannot perform this operation because the connection pool has been close android串口通信
public View getView(final int position, View convertView, ViewGroup parent) {
holder = null;
if (convertView == null) {
holder = new ViewHolder();
convertView = mInflater.inflate(R.layout.class_home_item, null);
holder = new ViewHolder();
holder.home_gd_rl = (RelativeLayout) convertView
.findViewById(R.id.home_gd_rl);
holder.msg_title_rl = (RelativeLayout) convertView
.findViewById(R.id.home_item_title_rl);
holder.userIcon = (ImageView) convertView
.findViewById(R.id.home_item_user_iv);
holder.msgTime = (TextView) convertView
.findViewById(R.id.home_item_time);
holder.msgTitle = (TextView) convertView
.findViewById(R.id.home_item_title);
holder.iv_msg_type = (ImageView) convertView
.findViewById(R.id.iv_msg_type);
holder.content_ll = (LinearLayout) convertView
.findViewById(R.id.home_item_content_rl);
holder.image_rl = (RelativeLayout) convertView
.findViewById(R.id.image_rl);
holder.msgImage = (ImageView) convertView
.findViewById(R.id.home_item_content_iv);
holder.msgImage_gridview = (GridView) convertView
.findViewById(R.id.home_iv_grid);
holder.msgContent_rl = (RelativeLayout) convertView
.findViewById(R.id.content_text_rl);
holder.msgContent = (TextView) convertView
.findViewById(R.id.home_item_content);
holder.comment_rl = (RelativeLayout) convertView
.findViewById(R.id.feed_item_layout_comment);
holder.praise_rl = (RelativeLayout) convertView
.findViewById(R.id.feed_item_layout_praise);
holder.comment_nub = (TextView) convertView
.findViewById(R.id.comment_nub_tv);
holder.praise_iv = (ImageView) convertView
.findViewById(R.id.praise_iv);
holder.msg_iv_pr = (ProgressBar) convertView
.findViewById(R.id.progressBar1);
// 点赞别表
holder.praise_list_rl = (LinearLayout) convertView
.findViewById(R.id.praise_list_rl); holder.praise_first = (TextView) convertView
.findViewById(R.id.tv_praise_first);
holder.praise_second = (TextView) convertView
.findViewById(R.id.tv_praise_second);
holder.praise_third = (TextView) convertView
.findViewById(R.id.tv_praise_thrid);
holder.praise_sub1 = (TextView) convertView
.findViewById(R.id.tv_praise_text_1);
holder.praise_number = (TextView) convertView
.findViewById(R.id.tv_praise_text_2);
holder.praise_sub2 = (TextView) convertView
.findViewById(R.id.tv_praise_text_3);
convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag();
}
msg = messageList.get(position); // 有图片的动态
if (msg.getOPImageList().size() == 0) { holder.msgImage.setVisibility(View.GONE); holder.msgImage_gridview.setVisibility(View.GONE);
holder.home_gd_rl.setVisibility(View.GONE);
holder.msg_iv_pr.setVisibility(View.GONE);
holder.image_rl.setVisibility(View.GONE); } else if (msg.getOPImageList().size() == 1) {
holder.image_rl.setVisibility(View.VISIBLE);
holder.msgImage_gridview.setVisibility(View.GONE);
holder.home_gd_rl.setVisibility(View.GONE); Image_url = new StringBuffer(AppConstant.DOWNLOAD_IMAGE_URL)
.append(msg.getOPImageList().get(0).getImageUrl())
.toString(); ImageView imageView = holder.msgImage; Bitmap cachedImage = fengle.loadDrawable(context, Image_url,
new ImageCallback() { @Override
public void imageLoaded(Bitmap imageDrawable,
String imageUrl) {
ImageView imageViewByTag = (ImageView) listview
.findViewWithTag(imageUrl);
Log.i("test",
"Drawable cachedImage = asyncImageLoader.loadDrawable( )-->");
if (imageViewByTag != null && imageDrawable != null) { // 防止图片url获取不到图片是,占位图片不见了的情况
imageViewByTag.setImageBitmap(imageDrawable);
} }
});
if (cachedImage == null) {
holder.msgImage.setImageResource(R.drawable.pic_bg);
} else {
holder.msgImage.setImageBitmap(cachedImage);
}
} else {
// 多张图片 holder.image_rl.setVisibility(View.GONE);
holder.home_gd_rl.setVisibility(View.VISIBLE);
holder.home_gd_rl.setFocusable(false);
holder.msgImage.setVisibility(View.GONE);
holder.msgImage_gridview.setVisibility(View.VISIBLE);
holder.msg_iv_pr.setVisibility(View.GONE);
holder.msgImage_gridview.setFocusable(false);
}
if (isCanClick.get(position) == false) {
holder.praise_iv.setImageDrawable(context.getResources()
.getDrawable(R.drawable.dashboard_recommand_off_default));
} else {
holder.praise_iv.setImageDrawable(context.getResources()
.getDrawable(R.drawable.dashboard_recommand_on_default));
} holder.comment_rl.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
Log.e("", "////////////////////");
}
}); holder.praise_rl.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
current_position = position;
praiseSubmit();
}
}); holder.msgTitle.setText(msg.getUserName());
StringBuffer str = new StringBuffer(msg.getActivityDate());
String create_time = str.append(" " + msg.getActivityTime()).toString();
holder.msgTime.setText(create_time);
holder.msgContent.setText(msg.getUserActivityString());
initPraiseView();
if (msg.getOPCommentsList().size() == 0) {
holder.comment_nub.setText("");
} else {
holder.comment_nub.setText(String.valueOf(msg.getOPCommentsList()
.size()));
}
holder.content_ll.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
}
});
return convertView;
}
这一步有重复了,但不是这个的问题
删代码的时候忘删了
我决定不是异步加载图片的问题, 我debug了一下 不管用到什么方式 回调还是AsyncTask,都会进到最后setimagebitamp这一步可是图片就是加载不出来一般在文件中的图片读取也还是挺快的呀第一次是能加载的 滑动后就怎么都加载不出来本人很菜 也不知道哪里出了问题
.findViewWithTag(imageUrl); 问题应该在这一句 你这个搜索 只会找到第一个TAG 是imageUrl的控件。 可能并不是你的要更新的控件。比如 你setTAG了 , listView 会重用item的, 在 msg.getOPImageList().size()=0 时候 还是有这个tag。
然后你find的结果就是这个contentView里面的,不是你要更新的那个ImageView。
holder.image_rl.setVisibility(View.VISIBLE);
holder.msgImage_gridview.setVisibility(View.GONE);
holder.home_gd_rl.setVisibility(View.GONE);里加上 image.setvisibility(view.visible)就行了
差了一个imageview 的显示(好坑啊)
谢谢各位了