проблема при загрузке изображений с помощью Picasso

у меня есть один прядильщик. когда я устанавливаю изображение в spinner.load image неправильно. поэтому, что случилось, какое-то изображение выглядит маленьким, какое-то изображение не отображается, когда я прокручиваю вниз или вверх, какое-то изображение не отображается. иногда то, что произошло при загрузке изображения, требует времени

SpinnerAdapterRecharge.java

public class SpinnerAdapterRecharge extends ArrayAdapter<listview_data> {
    private Activity context;
    listview_data data[] = null;
    int layoutResourceId;

    public SpinnerAdapterRecharge(Activity context, int resource,listview_data[] data)
    {
        super(context, resource, data);
        this.context = context;
        this.data = data;
        this.layoutResourceId = resource;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
        return getDropDownView(position, convertView, parent);
    }

    @Override
    public View getDropDownView(int position, View convertView, ViewGroup parent)
    {   // This view starts when we click the spinner.
        View row = convertView;
        listHolder holder = null;
        if(row == null)
        {
            LayoutInflater inflater = ((Activity)context).getLayoutInflater();
            row = inflater.inflate(layoutResourceId, parent, false);

            holder = new listHolder();
            holder.imgIcon = (ImageView)row.findViewById(R.id.spinnerimageIcon);
            holder.txtTitle = (TextView)row.findViewById(R.id.spinnerOperator);

            row.setTag(holder);
        }
        else
        {
            holder = (listHolder)row.getTag();
        }
        listview_data item = data[position];

        if(position == 0)
        {
            holder.imgIcon.setVisibility(View.GONE);
            holder.txtTitle.setText(context.getResources().getString(R.string.lbl_operator));
        }
        else {
                Picasso.with(context)
                        .load(item.icon)
                        .resize(30, 30)
                        .error(R.drawable.imagenotavailable)
                        .into(holder.imgIcon);

                    holder.txtTitle.setText(item.title);
        }

        return row;
    }
    static class listHolder
    {
        ImageView imgIcon;
        TextView txtTitle;
    }
}

person Varshil shah    schedule 30.03.2016    source источник
comment
Потому что Пикассо загружает его асинхронно.   -  person Murat Karagöz    schedule 30.03.2016
comment
пожалуйста, по возможности подробно объясните .. и любой другой вариант   -  person Varshil shah    schedule 30.03.2016
comment
Вы также устанавливаете holder.imgIcon.setVisibility(View.GONE). В условии else должно быть View.VISIBLE на тот случай, если вы получите переработанный вид на postion >= 0.   -  person MH.    schedule 30.03.2016


Ответы (1)


Ради ответа на ваш вопрос:

Прямо сейчас Пикассо загружает изображения асинхронно следующим образом:

 Picasso.with(context)
                        .load(item.icon)
                        .resize(30, 30)
                        .error(R.drawable.imagenotavailable)
                        .into(holder.imgIcon);

Если вы хотите, чтобы это было синхронно, вы можете использовать get() метод Пикассо.

 Bitmap bitmap = Picasso.with(context)
                        .load(item.icon)
                        .resize(30, 30)
                        .error(R.drawable.imagenotavailable)
                        .get();
 someImageView.setImageBitmap(bitmap);

Вот, возможно, лучшее решение из другого ответа SO.

/**
 * Loads the request into an imageview.
 * If called from a background thread, the request will be performed synchronously.
 * @param requestCreator A request creator
 * @param imageView The target imageview
 * @param callback a Picasso callback
 */
public static void into(RequestCreator requestCreator, ImageView imageView, Callback callback) {
  boolean mainThread = Looper.myLooper() == Looper.getMainLooper();
  if (mainThread) {
    requestCreator.into(imageView, callback);
  } else {
    try {
      Bitmap bitmap = requestCreator.get();
      imageView.setImageBitmap(bitmap);
      if (callback != null) {
        callback.onSuccess();
      }
    } catch (IOException e) {
      if (callback != null) {
        callback.onError();
      }
    }
  }
}

Источник: Синхронная загрузка изображения в фоновом потоке с Пикассо - без .get ()


По сути, в этом и заключается синхронная загрузка.

person Murat Karagöz    schedule 30.03.2016
comment
эй, я использовал ваш код. но в методе get () отображается ошибка - person Varshil shah; 30.03.2016