Autore Topic: Scrolling GridView : Impuntamenti e lag  (Letto 478 volte)

Offline giupardeb

  • Utente junior
  • **
  • Post: 115
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Glaxy Note 4
Scrolling GridView : Impuntamenti e lag
« il: 11 Agosto 2015, 17:11:21 CEST »
0
Buona sera ragazzi, ho un problema con lo scrolling di una Activity che implementa una GridView di immagini. In pratica quando faccio lo scroll, vedo degli evidenti impuntamenti e lag. Questo è il codice dell'adapter della gridView:

Codice: [Seleziona]
public class GridViewImageAdapter extends BaseAdapter {

    private Activity _activity;
    private ArrayList<String> _filePaths = new ArrayList<String>();
    private int imageWidth;

    public GridViewImageAdapter(Activity activity, int imageWidth, ArrayList<String> filePaths) {

        this._activity = activity;
        this.imageWidth = imageWidth;
        this._filePaths = filePaths;
    }

    @Override
    public int getCount() {
        return this._filePaths.size();
    }

    @Override
    public Object getItem(int position) {
        return this._filePaths.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ImageView imageView;

        if (convertView == null) {
            imageView = new ImageView(_activity);
        } else {
            imageView = (ImageView) convertView;
        }

        // get screen dimensions
        Bitmap image = decodeFile(_filePaths.get(position), imageWidth,
                imageWidth);

        imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
        imageView.setLayoutParams(new GridView.LayoutParams(imageWidth,
                imageWidth));
        imageView.setImageBitmap(image);

        return imageView;
    }

    /*
     * Resizing image size
     */
    public static Bitmap decodeFile(String filePath, int WIDTH, int HIGHT) {
        try {

            File f = new File(filePath);

            BitmapFactory.Options o = new BitmapFactory.Options();
            o.inJustDecodeBounds = true;
            BitmapFactory.decodeStream(new FileInputStream(f), null, o);

            final int REQUIRED_WIDTH = WIDTH;
            final int REQUIRED_HIGHT = HIGHT;
            int scale = 1;
            while (o.outWidth / scale / 2 >= REQUIRED_WIDTH
                    && o.outHeight / scale / 2 >= REQUIRED_HIGHT)
                scale *= 2;

            BitmapFactory.Options o2 = new BitmapFactory.Options();
            o2.inSampleSize = scale;
            return BitmapFactory.decodeStream(new FileInputStream(f), null, o2);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }
}

Come posso risolvere questo fastidioso lag? Grazie mille anticipatamente :)

Offline tonno16

  • Utente storico
  • *****
  • Post: 1184
  • Respect: +57
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Scrolling GridView : Impuntamenti e lag
« Risposta #1 il: 12 Agosto 2015, 00:38:13 CEST »
0
Il problema deriva dai bitmap.
Devi caricarli con un thread separato.
Ti consiglio di usare Picasso. È una libreria per gestire LR immagini. Essa carica in un thread i bitmap. Vedrai che risolvi molti problemi. Puoi anche... Anzi dovresti ridimensionate le immagini. Non più di 200px.
6 righe di codice (guarda la home del sito Picasso) e rimuoverà i molto del lag presente.

Inoltre cerca di rimuovere tutti i wrap content che hai nei parametri di altezza nel layout che usi. Metti una dimensione fissa

Offline giupardeb

  • Utente junior
  • **
  • Post: 115
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Glaxy Note 4
Re:Scrolling GridView : Impuntamenti e lag
« Risposta #2 il: 12 Agosto 2015, 02:15:17 CEST »
0
Ciao tonno16 ti ringrazio per la risposta, e ti replico.

Allora ho importato la libreria Picasso, e al posto del metodo getView che ho precedentemente inserito nel topic in alto, ho inserito questo metodo:

Codice: [Seleziona]
@Override
    public View getView(int position, View convertView, ViewGroup parent) {
        SquaredImageView view = (SquaredImageView) convertView;
        if (view == null) {
            view = new SquaredImageView(context);
        }

        Picasso.with(_activity).load(_filePaths.get(position)).resize(50, 50).into(view);
    }


però ho dei problemi. 1. Non riesce a risolvere la classe SquaredImageView. 2. ovviamente per fare l'Ovveride del metodo getView, devo avere un oggetto di ritorno di tipo View, dove posso prendere questo oggetto?

Credo di aver importato correttamente la libreria picasso, anche perché automaticamente android studio si è importato il package: import com.squareup.picasso.Picasso;

COme posso risolvere questi problemi ? Grazie mille

Offline tonno16

  • Utente storico
  • *****
  • Post: 1184
  • Respect: +57
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Scrolling GridView : Impuntamenti e lag
« Risposta #3 il: 12 Agosto 2015, 09:42:26 CEST »
0
Non ho capito perché hai cambiato il metodo. Alla fine dovevi eliminare la riga dove crravi il bitmap e rimpiazzarla con Picasso.load.....
Ti consiglio di usare il pattern view holder. Inoltre sai le differenze fra BaseAdapter e ArrayAdapter?

Offline giupardeb

  • Utente junior
  • **
  • Post: 115
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Glaxy Note 4
Re:Scrolling GridView : Impuntamenti e lag
« Risposta #4 il: 12 Agosto 2015, 10:15:17 CEST »
0
In effetti stavo cercando di capire se fosse stato utile eliminare l'intero metodo..per come hai detto bastava solamente mettere il metodo Picasso.load. ti ringrazio..e com un nque non saprei nè come usare il pattern view holder, né tanto meno la differenza tra base BaseAdapter e ArrayAdapter. Puoi consigliarmi qualche tutorial-documentazione?

Post unito: 12 Agosto 2015, 17:02:04 CEST
Allora, questo è il mio nuovo metodo GetView:

Codice: [Seleziona]
@Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ImageView imageView;

        if (convertView == null) {
            imageView = new ImageView(_activity);
        } else {
            imageView = (ImageView) convertView;
        }

        // get screen dimensions
        //Bitmap image = decodeFile(_filePaths.get(position), imageWidth,imageWidth);
        imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
        imageView.setLayoutParams(new GridView.LayoutParams(imageWidth, imageWidth));

        Picasso.with(_activity).load(_filePaths.get(position)).into(imageView);

        //imageView.setImageBitmap(image);

        return imageView;
    }

purtroppo anche se le immagini ci sono.. io visualizzo solo schermata nera..
« Ultima modifica: 12 Agosto 2015, 17:02:04 CEST da giupardeb, Reason: Merged DoublePost »