Android RecyclerView и Picasso

59
13 июня 2018, 20:50

Есть RecyclerView с публикациями (в вью этих публикаций есть ImageView). Например загрузил из инета 100 публикаций и для каждой с помощью Picasso библоиотеки загружаю картинки в ImageView.

Picasso.with(context).load(url).placeholder(placeholderImage).error(errorImage).into(ImageView);

Так вот проблема такая что в первых 7-10 публикаций загружаеться изоброжения а остальные стоят также placeholderImage. Есть догатка что это изза того что если в кеш RecyclerView уходит еще не загруженная ImageView то он так и остаеться placeholderImage. Но не знаю изза чего точно и как решить?

Вота код адаптера:

public class RecAdapter extends RecyclerView.Adapter<RecAdapter.ViewHolder> {
private ArrayList<Data_Publication> data;
private LayoutInflater inflater;
private Context context;
private Callback callback;
public RecAdapter(Context context , ArrayList<Data_Publication> data_list , Callback callback){
    this.context = context;
    this.data = data_list;
    this.inflater = LayoutInflater.from(context);
    this.callback = callback;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = inflater.inflate(R.layout.publication, parent , false);
    return new ViewHolder(view);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    Data_Publication pub = data.get(position);
    holder.setName(pub.getProduct_name());
    holder.setPrice(pub.getProduct_price());
    holder.setLocation(pub.getProduct_locaton());
    holder.setClicker(pub.getProduct_id() , pub.getProduct_name());
    holder.loadImage(pub.getPhotoStroge().concat(pub.getImage_url()));
}
@Override
public int getItemCount() {
    return data.size();
}
public class ViewHolder extends RecyclerView.ViewHolder{
    final private TextView name;
    final private TextView price;
    final private TextView location;
    final private ImageView image;
    final private LinearLayout content;
    final private LinearLayout main;
    private ViewHolder(View view) {
        super(view);
        this.name = (TextView) view.findViewById(R.id.pub_name);
        this.price = (TextView) view.findViewById(R.id.pub_price);
        this.location = (TextView) view.findViewById(R.id.pub_location);
        this.image = (ImageView) view.findViewById(R.id.pub_image);
        this.content = (LinearLayout) view.findViewById(R.id.pub_content);
        this.main = (LinearLayout) view.findViewById(R.id.pub_main);
    }
    public void setName(String name) {
        this.name.setText(name);
    }
    public void setPrice(String price) {
        this.price.setText(price);
    }
    public void setLocation(String location){
        this.location.setText(location);
    }
    public void loadImage(String url){
        Picasso.with(context).load(url).placeholder(R.drawable.placeholder).error(R.drawable.error_ph).into(this.image);
    }
    public void setClicker(final String id , final String name){
        final Animation anim = AnimationUtils.loadAnimation(context, R.anim.move_left);
        content.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                main.startAnimation(anim);
                callback.operation(id , name);
            }
        });
    }
}
}
Answer 1

Редактировал здесь, так что возможно будут ошибки

Если проблема только в загрузке картинки, то попробуйте так

public class RecAdapter extends RecyclerView.Adapter<RecAdapter.ViewHolder> {
private ArrayList<Data_Publication> data;
private LayoutInflater inflater;
private Context context;
private Callback callback;
public RecAdapter(Context context , ArrayList<Data_Publication> data_list , Callback callback){
    this.context = context;
    this.data = data_list;
    this.inflater = LayoutInflater.from(context);
    this.callback = callback;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    сontext = parent.getContext(); //Подставляем context
    View view = inflater.inflate(R.layout.publication, parent , false);
    return new ViewHolder(view);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    Data_Publication pub = data.get(position);
    holder.setName(pub.getProduct_name());
    holder.setPrice(pub.getProduct_price());
    holder.setLocation(pub.getProduct_locaton());
    holder.setClicker(pub.getProduct_id() , pub.getProduct_name());
    //holder.loadImage(pub.getPhotoStroge().concat(pub.getImage_url()));
    Picasso.with(context)
            .load(pub.getImage_url())
            //Всякие ваши плюшки
            .into(holder.image);    
}
@Override
public int getItemCount() {
    return data.size();
}
public class ViewHolder extends RecyclerView.ViewHolder{
    final private TextView name;
    final private TextView price;
    final private TextView location;
    final private ImageView image;
    final private LinearLayout content;
    final private LinearLayout main;
    private ViewHolder(View view) {
        super(view);
        this.name = (TextView) view.findViewById(R.id.pub_name);
        this.price = (TextView) view.findViewById(R.id.pub_price);
        this.location = (TextView) view.findViewById(R.id.pub_location);
        //Не уверен, нужен ли здесь this
        // но я делаю так
        image = (ImageView) view.findViewById(R.id.pub_image);
        this.content = (LinearLayout) view.findViewById(R.id.pub_content);
        this.main = (LinearLayout) view.findViewById(R.id.pub_main);
    }
    public void setName(String name) {
        this.name.setText(name);
    }
    public void setPrice(String price) {
        this.price.setText(price);
    }
    public void setLocation(String location){
        this.location.setText(location);
    }
// Обработку тапа тоже бы перенес в onBindViewHolder!
        public void setClicker(final String id , final String name){
            final Animation anim = AnimationUtils.loadAnimation(context, R.anim.move_left);

        content.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                main.startAnimation(anim);
                callback.operation(id , name);
            }
        });
    }
}
}
READ ALSO
Time, TimerTask java

Time, TimerTask java

Есть метод set() который задает значение enum - STARTEDКак сделать так, чтобы через определенное время duration значение enum задалось как FINISHED

34
Android Как достать Дату

Android Как достать Дату

ЗдраствуйтеМне нужно дастать Текущею дату и сравнить с датой сохраненой например в sharedPreferences

50
Хранения данных Андроид

Хранения данных Андроид

Всем приветМожно ли как то сохранить информацию так чтобы оно имелось даже после того как приложения будет удалено и заново установлено?...

56