Android: Listview показывает неправильные изображения при прокрутке
Я загружаю изображения из Интернета с помощью универсального загрузчика изображений. Некоторые снимки устанавливаются как аватары, поэтому я закругляю их, а другие растягиваются. проблема в списке показывает неправильное изображение при прокрутке и через некоторое время показывает правильное изображение. Я искал stackoverflow для аналогичной проблемы, но я не могу заставить его работать правильно.
Я использую пользовательский адаптер и код getview, а код для округления и растяжения изображения выглядит следующим образом:
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View view = convertView;
final ViewHolder holder;
if(view == null)
{
inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.whatsnew_listitem, null);
holder = new ViewHolder();
holder.playButton = (ImageButton) view.findViewById(R.id.btn_playVideo);
holder.mediaThumbnail = (ImageView) view.findViewById(R.id.imageview_mediaImage);
holder.avatar = (ImageView) view.findViewById(R.id.imageview_avatar);
holder.artistName = (TextView) view.findViewById(R.id.textview_artistName);
holder.timestamp = (TextView) view.findViewById(R.id.textview_timestamp);
holder.status = (TextView) view.findViewById(R.id.textview_title);
view.setTag(holder);
} else {
holder = (ViewHolder) view.getTag();
}
pos = position;
Item item = items.get(position);
if(item.getArtistName() != "")
{
// set thumbnail
String thumbnailURL = "";
holder.mediaThumbnail.setVisibility(View.INVISIBLE);
if(item.getUpdateType() == Config.UPDATE_TYPE_1)
{
holder.playButton.setVisibility(View.GONE);
thumbnailURL = item.getPictureUri();
if(thumbnailURL != null)
{
ImageLoader.getInstance().loadImage(thumbnailURL, new SimpleImageLoadingListener() {
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
setImage(loadedImage, imageView, Config.MEDIA);
mediaImages[position] = true;
imageView.setVisibility(View.VISIBLE);
}
});
}
holder.status.setText(item.getMessage());
}
else if(item.getUpdateType() == Config.UPDATE_TYPE_2)
{
//play button
holder.playButton.setVisibility(View.VISIBLE);
//set media image
thumbnailURL = item.getVideoThumbnailUri();
if(thumbnailURL != null)
{
ImageLoader.getInstance().loadImage(thumbnailURL, new SimpleImageLoadingListener() {
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage)
{
setImage(loadedImage, imageView, Config.MEDIA);
mediaImages[position] = true;
imageView.setVisibility(View.VISIBLE);
}
});
}
//set youtube status
holder.status.setText(item.getTitle());
holder.playButton.bringToFront();
holder.playButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(item.getVideoId()!= null) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(Config.YOUTUBE_URI + item.getVideoId() ));
context.startActivity(intent);
}
}
});
}
//set avatar
String avatarURL = item.getAvatarImageUri();
holder.avatar.setVisibility(View.INVISIBLE);
if(avatarURL != null)// && avatarImages[position] == false)
{
ImageLoader.getInstance().loadImage(avatarURL, new SimpleImageLoadingListener() {
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
setImage(loadedImage, imageView, Config.AVATAR);
avatarImages[position] = true;
imageView.setVisibility(View.VISIBLE);
}
});
}
//set artist name
holder.artistName.setText(item.getArtistName());
//set timestamp
if(timerList[position] == false)
{
updateTime(holder.timestamp, item);
}
}
view.setTag(holder);
return view;
}
//@Override
public void setImage(final Bitmap bitmap, final ImageView imageView, final String imagetype) {
// TODO Auto-generated method stub
Activity activity = (Activity) context;
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
Bitmap croppedBmp = null;
int imageHeight = bitmap.getHeight();
int imageWidth = bitmap.getWidth();
if(imagetype == Config.MEDIA)
{
if(imageHeight <imageWidth) {
croppedBmp = Bitmap.createScaledBitmap( bitmap, dp, dp, true);
imageView.setImageBitmap(croppedBmp);
}
}
else if(imagetype == Config.AVATAR)
{
int radius;
if(imageWidth > imageHeight)
{
croppedBmp = Bitmap.createBitmap(imageHeight, imageHeight, Bitmap.Config.ARGB_4444);
radius = imageHeight/2;
}
else
{
croppedBmp = Bitmap.createBitmap(imageWidth, imageWidth, Bitmap.Config.ARGB_4444);
radius = imageWidth/2;
}
Canvas canvas = new Canvas(croppedBmp);
final int color = 0xff424242;
final Paint paint = new Paint();
final Rect rect = new Rect(0, 0, imageWidth, imageHeight);
paint.setAntiAlias(true);
canvas.drawARGB(0, 0, 0, 0);
paint.setColor(color);
canvas.drawCircle(radius, radius, radius, paint);
paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
canvas.drawBitmap(bitmap, rect, rect, paint);
imageView.setImageBitmap(croppedBmp);
ImageLoader.getInstance().displayImage(uri, imageView, listener)
notifyDataSetChanged();
}
}
});
}
Ответы
Ответ 1
попробуйте этот пример
http://android.amberfog.com/?p=296
используйте этот метод
public int getItemViewType(int position) {
return mSeparatorsSet.contains(position) ? TYPE_SEPARATOR : TYPE_ITEM;
}
и получить следующий вид в getView()
int type = getItemViewType(position);
Я решил проблему после примера
Ответ 2
Инициализировать представления вне условия if else
if(view == null)
{
inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.whatsnew_listitem, null);
holder = new ViewHolder();
view.setTag(holder);
} else {
holder = (ViewHolder) view.getTag();
}
holder.playButton = (ImageButton) view.findViewById(R.id.btn_playVideo);
holder.mediaThumbnail = (ImageView) view.findViewById(R.id.imageview_mediaImage);
holder.avatar = (ImageView) view.findViewById(R.id.imageview_avatar);
holder.artistName = (TextView) view.findViewById(R.id.textview_artistName);
holder.timestamp = (TextView) view.findViewById(R.id.textview_timestamp);
holder.status = (TextView) view.findViewById(R.id.textview_title);
Ответ 3
использовать переопределить mpg для ImageLoader
@Override
public void onLoadingStarted(String imageUri, View view) {
ImageLoader.getInstance().displayImage(imageUri, (ImageView) view);
}
а в displayOptions используется изображение заглушки, которое будет отображаться до тех пор, пока изображение не загрузится с URL-адреса.
DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder()
.showStubImage(R.drawable.com_facebook_profile_default_icon).build();
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getActivity()).defaultDisplayImageOptions(defaultOptions).build();
Ответ 4
В каждый момент ListView отображаются несколько элементов (тех, кто "подходит" к дисплею), и вместо создания нового во время щелчка новые элементы заменяли старый в списке
Попробуйте следующее:
public class Info {
private ImageView mediaThumbnail;
private ImageView avatar;
...
public ImageView getMediaThumbnail() {
return mediaThumbnail;
}
public void setMediaThumbnail(ImageView mediaThumbnail) {
this.mediaThumbnail = mediaThumbnail;
}
...
}
В адаптере добавьте поле ViewHolder Info info
и напишите следующий код
public View getView(int position, View convertView, ViewGroup parent) {
row = convertView;
Info info = getItem(position);
if (null == row)
setupRow(parent, info);
else
getRow(info);
...
}
private void setupRow(ViewGroup parent, Info info) {
LayoutInflater inflater = (LayoutInflater) getContext()
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.list_item, parent, false);
holder = new ViewHolder();
holder.playButton = (ImageButton) view.findViewById(R.id.btn_playVideo);
holder.mediaThumbnail = (ImageView) view.findViewById(R.id.imageview_mediaImage);
holder.avatar = (ImageView) view.findViewById(R.id.imageview_avatar);
holder.artistName = (TextView) view.findViewById(R.id.textview_artistName);
holder.timestamp = (TextView) view.findViewById(R.id.textview_timestamp);
holder.status = (TextView) view.findViewById(R.id.textview_title);
view.setTag(holder);
}
private void getRow(DownloadInfo info) {
holder = (ViewHolder) row.getTag();
holder.info.setMediaThumbnail(null);
...
holder.info = info;
holder.info.setMediaThumbnail(holder.mediaThumbnail);
...
}