J'ai une liste contient: contentString et liste des images, cela ressemble à:

[{
"contentString": "Image",
"images": [{
    "image": "url"
}]
}, {...}]

Ensuite, j'essaye de le charger dans ListView.

Mon titulaire:

class Holder {
    TextView Content;
    ImageView ImageButton;
    ImageLoader imageLoaderPost;
    public Holder(TextView Content, ImageView ImageButton, ImageLoader imageLoader) {            
        this.Content = Content;
        this.ImageButton = ImageButton;
        this.imageLoaderPost = imageLoader;
    }

}

Charger la vue dans ListView:

public View getView(final int position, View convertView, ViewGroup parent) {
View v = convertView;

final Holder holder;
if (v == null) {
    v = inflater.inflate(R.layout.activity_row, parent, false);
    TextView Content = (TextView) v.findViewById(R.id.ContentTextView);
    ImageView ImageButton = (ImageView) v.findViewById(R.id.ImageButton);
    ImageLoader imageLoaderPost = ImageLoader.getInstance();
    holder = new Holder(Content, ImageButton, imageLoaderPost);
    v.setTag(holder);
} else {
    holder = (Holder) v.getTag();
}

final HTPost post = postList.get(position);

// post content
holder.postContent.setText(post.getContentString());

//
DisplayImageOptions options = new DisplayImageOptions.Builder()
    .imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2)
    .considerExifParams(true)
    .resetViewBeforeLoading(true)
    .cacheOnDisk(true)
    .imageScaleType(ImageScaleType.EXACTLY)
    .bitmapConfig(Bitmap.Config.RGB_565)
    .build();
// image
if (post.getImages().size() > 0) {

    holder.imageLoaderPost.displayImage(post.getImages().get(0).getImage(), holder.postImageButton, options, new ImageLoadingListener() {@Override
        public void onLoadingStarted(String s, View view) {

        }

        @Override
        public void onLoadingFailed(String s, View view, FailReason failReason) {}

        @Override
        public void onLoadingComplete(String s, View view, Bitmap bitmap) {


        }

        @Override
        public void onLoadingCancelled(String s, View view) {}
    });
} else {
    //holder.imageLoaderPost.cancelDisplayTask(holder.postImageButton);
    log("Wrong image: " + post.getContentString());
}
return v;
}

Les lignes n'ayant pas d'image, je ne charge que contentString et j'imprime: log("Wrong image: " + post.getContentString());

Mais dans ListView, je vois une image chargée avec du contenu. (Ligne sans image mais avec image dans ListView, l'image coïncide avec 1 dans toutes les images à charger avant).

Je ne sais pas pourquoi, peut-être cache de ImageLoader?
Toute aide, merci!

1
rome 웃 25 déc. 2015 à 06:53

2 réponses

Meilleure réponse

Vous utilisez ViewHolder donc la ligne in ListView sera réutilisé sans recréer à plusieurs reprises. Par conséquent, vous aurez l'image dans toutes les lignes.

La solution simple est de cacher ImageView dans les lignes où vous ne le voulez pas

    if(your condition){
        ...
        holder.ImageButton.setVisibility(View.VISIBLE);
        ... load your image
        ...
    } else {
        log("Wrong image: " + post.getContentString());

        holder.ImageButton.setVisibility(View.INVISIBLE);  //hide your ImageView or you can load default image
    }

J'espère que cette aide

1
Phan Van Linh 25 déc. 2015 à 04:41

Pour charger une image à partir du serveur de manière asynchrone, vous pouvez utiliser la petite bibliothèque Picasso, c'est juste un code de ligne. Voici gradle

compile 'com.squareup.picasso:picasso:2.3.3'

Voici votre ImageView

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/imageView"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true" />

Voici le code java simple

ImageView imageView = (ImageView) findViewById(R.id.imageView);

    Picasso.with(this)
            .load("YOUR_IMAGE_URL")
            .into(imageView);

C'est ça. Pour plus d'informations, visitez ici

0
Md. Sajedul Karim 30 mars 2016 à 11:52