Recyclerview ritardo di scorrimento

Sto usando Recyclerview Gridlayout e mi trovo di fronte a un rallentamento, mentre scorrimento.

Poiché io sto usando RecyclerView.Adattatore ViewHolder c’è già.

Altri che non ci sono condizioni in onBindViewHolder cioè onCreateView metodo.

Anche io sto facendo i nuovi oggetti non vengono creati.

Sto usando Universale imageloader e mi soffermo recyclerview imageloader su di scorrimento.

Ho trovato che la dimensione dell’Immagine sul disco di memoria varia da 50 a 300 kb circa è che hanno qualcosa a che fare con la velocità di scorrimento?

public class DealsRecyclerAdapter extends RecyclerView.Adapter<DealsRecyclerAdapter.ViewHolder> {
public ArrayList<DealItem> items = new ArrayList<DealItem>();
Context context;
DisplayImageOptions options;
protected ImageLoader imageLoader;
DealItemOnClickListener dealItemOnClickListener;

private static final String RESULTS = "results";

int layoutId;
DealItem item;
String storeName;
public static final String RS = "Rs.";
public static final String AVAIL_FROM = "available from ";
public static final String OFF = "% off";

static class ViewHolder extends RecyclerView.ViewHolder {

    protected TextView itemName;
    protected TextView itemPriceOrig;
    protected TextView itemDisc;
    protected TextView itemPrice;
    protected ImageView itemImage;
    protected TextView itemStore;
    protected TextView itemSpecialText;


    public ViewHolder(View itemView) {
        super(itemView);
        itemImage = (ImageView) itemView
                .findViewById(R.id.logo);
        itemName = ((CustomTextView) itemView
                .findViewById(R.id.title_product_search));
        itemPriceOrig = ((CustomTextView) itemView
                .findViewById(R.id.price_product_orig));
        itemDisc = ((CustomTextView) itemView
                .findViewById(R.id.product_disc));
        itemPrice = ((CustomTextView) itemView
                .findViewById(R.id.price_product));
        itemStore = (TextView) itemView
                .findViewById(R.id.prod_store);
        itemSpecialText = (TextView) itemView
                .findViewById(R.id.tvspecial);
         itemPriceOrig.setPaintFlags(itemPriceOrig
                .getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);                

    }

}

public DealsRecyclerAdapter(Context context, JSONObject jsonObject, int layoutId) {
    try {
        this.layoutId = layoutId;
        this.context = context;
        dealItemOnClickListener = (DealItemOnClickListener) (context);
        options = new DisplayImageOptions.Builder()
                .showImageOnLoading(R.drawable.load)
                .showImageForEmptyUri(R.drawable.load)
                .showImageOnFail(R.drawable.notfound)
                .cacheInMemory(true)
                .cacheOnDisk(true)
                .considerExifParams(true)
                .resetViewBeforeLoading(true)
                .imageScaleType(ImageScaleType.IN_SAMPLE_INT)
                .bitmapConfig(Bitmap.Config.RGB_565)
                .imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2)
                .build();

        imageLoader = ImageLoader.getInstance();

        JSONArray jsonArray = jsonObject.getJSONArray(RESULTS);
        for (int i = 0; i < jsonArray.length(); i++) {
            try {
                items.add(Utils.getdealIemFromJson(jsonArray.getJSONObject(i)));

            } catch (Exception e) {
            }

        }

    } catch (Exception e) {
    }

}

public void add(DealItem item) {
    items.add(item);
}

@Override
public int getItemCount() {
    return items.size();
}


@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(parent.getContext()).inflate(layoutId, parent, false);
    v.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (dealItemOnClickListener != null)
                dealItemOnClickListener.dealItemClicked(view);
        }
    });
    ViewHolder vh = new ViewHolder(v);
    return vh;
}

@Override
public void onBindViewHolder(final ViewHolder holder, int position) {

    item = (DealItem) items.get(position);

    holder.itemDisc.setText("(" + (int) Math.abs(item.discount) + OFF + ")");
    holder.itemPriceOrig.setText(RS + item.originalPrice);
    holder.itemPriceOrig.setVisibility(item.priceVisiblity);
    holder.itemDisc.setVisibility(item.discountVisiblity);
    holder.itemPrice.setText(RS + item.dealPrice);
    storeName = AVAIL_FROM + "<b>" + item.store + "</b>";
    holder.itemStore.setText(Html.fromHtml(storeName));
    holder.itemName.setText(item.title);
    holder.itemSpecialText.setText(item.specialText);
    holder.itemSpecialText.setVisibility(item.specialTextVisibility);
    imageLoader.displayImage(item.imageUrl, holder.itemImage, options);
    holder.itemView.setTag(item);
}

@Override
public long getItemId(int arg0) {

    return 0;
}

public interface DealItemOnClickListener {
    void dealItemClicked(View view);
}

public void setLayoutId(int layoutId) {
    this.layoutId = layoutId;
}

}

Posto il codice plz! Le informazioni che ci dà non è sufficiente per avere una risposta. grazie
Aggiunto il codice si prega di dare un’occhiata ora.Grazie

OriginaleL’autore amodkanthe | 2015-04-16

2 risposte

  1. 8

    Sia runtime di scala e la dimensione dell’immagine può avere un impatto.
    runtime di scala è di solito sconsigliato e dimensioni delle immagini direttamente impatti quanto potrebbe essere memorizzate nella cache in qualsiasi momento.

    Vorrei anche partecipare @Alireza domanda e vorrei aggiungere una domanda; se il commento di disattivare il caricamento delle immagini è ok?

    Vorrei anche fare riferimento a ciò che io ritengo sia meglio 3rd party per il caricamento delle immagini librerie come Affresco, Planata e Picasso che ho un sacco di esperienza e posso garantire per la loro efficienza.

    E, ultimo ma certamente non meno importante, vi invito a visualizzare una sessione data da una mia amica ha chiamato Correva Nachmany in cui spiega come analizzare tali questioni con scoperto, systrace e altri strumenti qui.

    Goodluck.

    ciao, Grazie per l’aiuto, ho provato a Picasso, ma è stata la causa di memoria insufficiente in quanto non ha una cache di file e per questo mi sono rivolto a universale del caricatore di immagini. Cercherò di Affresco e di efficienza e vi farò sapere. Grazie per l’invito per la sessione, stavo cercando qualcosa di simile a questo.
    Il piacere è mio, sentitevi liberi di accettare la mia risposta in qualsiasi momento 🙂
    utilizzando picasso con okhttp downloader ha funzionato per me

    OriginaleL’autore Royi Benyossef

  2. 3

    Ho letto il tuo codice attenzione, L’unica linea che sembra rendere il problema è questo

        imageLoader.displayImage(item.imageUrl, holder.itemImage, options);

    Non ho lavorato con UniversalImageLoader. Non gestisce il caricamento dell’immagine in seprate thread?

    in qualsiasi modo si può semplicemente verificare se questa linea sta facendo il problema mettendo questa esatta immagini nella directory di risorse e l’utilizzo di imageView.setImageResource per vedere se il problema persiste o meno.

    Nel caso In cui io sono a destra e UniversalImageLoader rende l’applicazione lenta, è possibile creare un AsyncTask e eseguire questa riga nel thread separato o forse utilizzando un altro caricamento dell’immagine della biblioteca come Picaso.

    Il prossimo candidato a causare il problema è che le immagini. 300K può essere basso, ma se si riassumono le dimensioni delle immagini si ottiene magabytes di utilizzo della memoria, che è sufficiente a causare il problema, anche migliori dispositivi android. (Android memoria monitor è uno strumento davvero utile qui!) e anche alcuni formati di immagine come .jpg utilizzare la compressione per ridurre le dimensioni e questo rende la decompressione di file più lento. Soluzione che è photoshop, è sufficiente creare nuova foto e copia e passato il già esistente e risparmiare. opzioni di default sono ok, la maggior parte delle volte!

    E un pensiero finale su estranei importa! Vedo il tuo trattamento jsonObject adattatore, che non è una buona pratica. Una volta inserito il codice all’interno della vostra attività/frammento o meglio, in alcune utilità di Rete di classe sarebbe molto meglio.

    Scusate se non posso essere più di aiuto. buona fortuna

    grazie per l’aiuto mi sarà sicuramente di implementare le modifiche che hai suggerito

    OriginaleL’autore Reza

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *