it-swarm.com.ru

Picasso загружает изображения в неправильный просмотр изображений в списке адаптеров

Я загружаю изображение с сервера в элемент списка, используя вот так:

public View getView(int position, View convertView, ViewGroup parent) {
    LayoutInflater inflater = (LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View participantView;
    if(convertView == null) {
        participantView = inflater.inflate(R.layout.participant_item, parent, false);
    } else {
        participantView = convertView;
    }

    TextView textView = (TextView) participantView.findViewById(R.id.participantName);
    textView.setText(getItem(position).getName());
    ImageView imageView = (ImageView) participantView.findViewById(R.id.participantImage);
    String profilePic = getItem(position).getProfilePic();

    if(!profilePic.equals("None")) {
        Log.d("tom.debug", "creating picture for user: " + getItem(position).getName());
        Picasso.with(this.context)
            .load(urlToProfilePics + profilePic)
            .placeholder(R.drawable.sample_0)
            .resize(52, 52)
            .into(imageView);
    } else {
        //load the place holder into the image view
        Picasso.with(this.context).load(R.drawable.sample_0);
    }

    if(!getItem(position).isHere()) {
        imageView.setColorFilter(Color.DKGRAY, PorterDuff.Mode.MULTIPLY);
    }

    return participantView;
}

Журнал отладки в операторе if срабатывает только для пользователей, у которых действительно есть изображение профиля. (Пользователи, которые не имеют, получат значение None).

Однако некоторые других элементов списка (которые не имеют изображения профиля) также загружают картинку.

Еще один полезный факт (я думаю): элементы, которые получают ошибку, меняются при прокрутке вверх и вниз по списку.

Я не уверен, что мне здесь не хватает.

16
Tom Klino

Убедитесь, что вы вызываете cancelRequest каждый раз, когда собираетесь использовать Picasso для getView () из адаптера.

// 1st: reset the imageView
Picasso.with(this.context).cancelRequest(holder.imageView); 

// 2nd start a new load for the imageView
Picasso.with(this.context).load(...).into(holder.imageView); 

Причина в том, что представление, которое вы повторно используете из параметра convertView , принадлежит предыдущей строке, которая, возможно, уже загружалась Пикассо для другого изображения.

Это действительно необходимо только при использовании convertView, если вы только что надули новую разметку, она не понадобится ... но вы всегда можете вызывать, чтобы сделать ваш код проще.

33
Alécio Carvalho

В вашем методе getView () измените код Пикассо следующим образом:

        try {
                Picasso.with(mActivity).
                        cancelRequest(holder.mImgCity);
                Picasso.with(mActivity).
                        load(getItem(position).getBackgroundImg()).
                        error(R.drawable.image_1).
                        into(holder.mImgCity);
            }
            catch (IllegalArgumentException e)
            {
                e.printStackTrace();
                holder.mImgCity.setImageResource(R.drawable.image_1); //<-- Important line
            }

Обновлено

Используйте концепцию Viewholder в вашем методе getView (). Вы сделаете все с этим только.

0
Sagar Shah

Пожалуйста, используйте следующие коды. Во-первых, это мой файл grid_row.xml. Это файл макета элементов сетки

<ProgressBar
    Android:layout_height="70dp"
    Android:layout_width="70dp"
    Android:id="@+id/myprogress"
    Android:layout_alignParentTop="true"
    Android:layout_centerHorizontal="true"
    Android:layout_below="@+id/title"       />

<View
    Android:layout_width="2dp"
    Android:layout_height="2dp"/>

<ImageView
    Android:layout_height="165dp"
    Android:id="@+id/imageView1"
    Android:layout_width="125dp"
    Android:scaleType="fitXY"
    Android:layout_alignParentTop="true"
    Android:layout_centerHorizontal="true"/>

<View
    Android:layout_width="2dp"
    Android:layout_height="2dp"/>

<TextView
    Android:text="TextView"
    Android:layout_height="wrap_content"
    Android:id="@+id/title"
    Android:layout_width="wrap_content"
    Android:layout_below="@+id/imageView1"
    Android:textStyle="bold"
    Android:layout_marginTop="2dp"
    Android:layout_centerHorizontal="true"
    Android:textSize="20sp"
    Android:ellipsize="Marquee">
</TextView>

<View
    Android:layout_width="2dp"
    Android:layout_height="2dp"/>

<TextView
    Android:text="TextView"
    Android:layout_height="wrap_content"
    Android:id="@+id/subTitle"
    Android:layout_width="wrap_content"
    Android:layout_below="@+id/title"
    Android:layout_marginTop="2dp"
    Android:layout_centerHorizontal="true"
    Android:textSize="18sp"
    Android:ellipsize="Marquee">
</TextView>

 </RelativeLayout>

Тогда, пожалуйста, продолжайте с классом адаптера для справки.

import Android.app.Activity;
import Android.content.Context;
import Android.content.Intent;
import Android.graphics.Bitmap;
import Android.graphics.drawable.Drawable;
import Android.util.Log;
 import Android.view.LayoutInflater;
import Android.view.View;
import Android.view.ViewGroup;
import Android.widget.BaseAdapter;
import Android.widget.Button;
import Android.widget.ImageButton;
import Android.widget.ImageView;
import Android.widget.ProgressBar;
import Android.widget.TextView;
import Android.widget.Toast;


import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.assist.FailReason;
import com.nostra13.universalimageloader.core.assist.ImageScaleType;
import    com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer;
import com.nostra13.universalimageloader.core.listener.ImageLoadingListener;
import com.nostra13.universalimageloader.core.listener.ImageLoadingProgressListener;
import com.nostra13.universalimageloader.core.listener.SimpleImageLoadingListener;
import com.squareup.picasso.Picasso;

import Java.util.ArrayList;

/**
 * Created by mpatil on 28/05/15.
 */
public class GridViewAdapter extends BaseAdapter
{
private ArrayList<String> listTitle;
private ArrayList<String> listSubTitle;
private ArrayList<String> imgp;

private Context activity;
ViewHolder view;
Configuration_Parameter m_config=Configuration_Parameter.getInstance();

public GridViewAdapter(Context activity,ArrayList<String> listTitle, ArrayList<String> subTitle,ArrayList<String> img)
{
    super();
    this.listTitle = listTitle;
    this.imgp = img;
    this.listSubTitle=subTitle;
    this.activity = activity;


}

@Override
public int getCount()
{
    // TODO Auto-generated method stub
    return listTitle.size();
}

@Override
public String getItem(int position)
{
    // TODO Auto-generated method stub
    return (String) (String) view.imgViewFlag.getTag();
}


@Override
public long getItemId(int position)
{
    // TODO Auto-generated method stub
    return 0;
}

public static class ViewHolder
{
    public ImageView imgViewFlag;
    public TextView txtViewTitle;
    public TextView txtViewSubTitle;
    public ProgressBar pg;

    public ViewHolder(View v)
    {

    }
    public ViewHolder()
    {
    }
}

@Override
public View getView(final int position, View convertView, ViewGroup parent)
{
    // TODO Auto-generated method stub
    View participentView=convertView;

    if(participentView == null || participentView.getTag() == null)
    {
        LayoutInflater inflater = null;
        inflater=(LayoutInflater) parent.getContext().getSystemService(activity.LAYOUT_INFLATER_SERVICE);
        view = new ViewHolder();
        participentView = inflater.inflate(R.layout.grid_layout, null);
        view.txtViewTitle = (TextView) participentView.findViewById(R.id.title);
        view.txtViewSubTitle = (TextView) participentView.findViewById(R.id.subTitle);
        view.pg=(ProgressBar)participentView.findViewById(R.id.myprogress);
        view.imgViewFlag = (ImageView) participentView.findViewById(R.id.imageView1);


        participentView.setTag(view);
    }
    else
    {
        view = (ViewHolder) participentView.getTag();
    }

        //download and display image from url

    view.txtViewTitle.setText(listTitle.get(position));
    view.txtViewSubTitle.setText(listSubTitle.get(position) + " subitem");
    ImageLoader imageLoader = null;
    imageLoader= ImageLoader.getInstance();

    DisplayImageOptions options = new DisplayImageOptions.Builder()
            .showImageForEmptyUri(R.drawable.paceholder) // resource or drawable
            .showImageOnFail(R.drawable.error_page_logo) // resource or drawable
            .resetViewBeforeLoading(false)  // default
            .delayBeforeLoading(1000)
            .cacheInMemory(true) // default
            .cacheOnDisk(true) // default
        .build();


    m_config.imageLoader.displayImage(imgp.get(position), view.imgViewFlag,options,new SimpleImageLoadingListener()
    {
        @Override
        public void onLoadingStarted(String imageUri, View v)
        {
            Log.i("Inside onLoadingStarted " + position,"Yes");
            view.imgViewFlag.setVisibility(View.INVISIBLE);
            view.pg.setVisibility(View.VISIBLE);
            view.imgViewFlag.setVisibility(View.INVISIBLE);
        }
        @Override
        public void onLoadingFailed(String imageUri, View v, FailReason failReason)
        {
            Log.i("Inside onLoadingFailed " + position,"Yes");
            view.pg.setVisibility(View.GONE);

        }
        @Override
         public void onLoadingComplete(String imageUri, View v, Bitmap    loadedImage)
        {
            Log.i("Ins onLoadingComplete " + position, "Yes");
            view.pg.setVisibility(View.GONE);
            view.imgViewFlag.setVisibility(View.VISIBLE);
            view.imgViewFlag.invalidate();
        }

    });



    return participentView;
 }

 }

Я уверен, что это поможет определенно. Спасибо NOSTRA за такую ​​замечательную библиотеку. Пальцы вверх...!!! Удачного кодирования ... :)

0
Meghana Patil