Autore Topic: Problema scorrimento lento Navigation Drawer  (Letto 710 volte)

Offline Mrpaoletto

  • Nuovo arrivato
  • *
  • Post: 19
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S3
  • Sistema operativo:
    Mac OS X 10.8
Problema scorrimento lento Navigation Drawer
« il: 26 Febbraio 2014, 22:18:04 CET »
0
Salve ragazzi, ho un piccolo problema con la Navigation Drawer. Seguendo la vostra guida sono riuscito a crearla senza problemi. Adesso l'ho un po' modificata cercando di caricare una lista di ImageView stile banner (invece della ImageView e della TextView come riportato nella guida). La lista della ImageView funziona senza problemi, l'unica anomalia è che è lenta nello scorrimento della stessa.Riporto un po' di codice:
Codice (Java): [Seleziona]
getActionBar().setDisplayHomeAsUpEnabled(true);
                getActionBar().setHomeButtonEnabled(true);

                mDrawer = (DrawerLayout) findViewById(R.id.drawer_layout);
                mDrawer.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
                _initMenu();
                mDrawerToggle = new CustomActionBarDrawerToggle(this, mDrawer);
                mDrawer.setDrawerListener(mDrawerToggle);
Mentre questo è il metodo "_initMenu()" che in effetti carica la mia listView di ImageView (che sono presenti sul disco):
Codice (Java): [Seleziona]
private void _initMenu() {
                NsMenuAdapter mAdapter = new NsMenuAdapter(this,this.getAssets());
                String[] menuItemsIcon = getResources().getStringArray(R.array.ns_menu_items_icon);

                for (String item : menuItemsIcon) {

                        int id_icon = getResources().getIdentifier(item,"drawable", this.getPackageName());

                        NsMenuItemModel mItem = new NsMenuItemModel(id_icon);
                        mAdapter.addItem(mItem);
                }
               
                mDrawerList = (ListView) findViewById(R.id.drawer);
                if (mDrawerList != null)
                        mDrawerList.setAdapter(mAdapter);

                mDrawerList.setOnItemClickListener(new DrawerItemClickListener());
        }

Grazie a tutti per la collaborazione

Offline ciccio

  • Utente junior
  • **
  • Post: 65
  • Respect: +7
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Francesco Cervone
  • Sistema operativo:
    Mac OS X 10.9
Re:Problema scorrimento lento Navigation Drawer
« Risposta #1 il: 27 Febbraio 2014, 07:55:11 CET »
0
Quello che conta veramente penso sia il codice dell'adapter. Puoi postarlo?

Inviato dal mio Nexus 7 utilizzando Tapatalk


Offline Mrpaoletto

  • Nuovo arrivato
  • *
  • Post: 19
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S3
  • Sistema operativo:
    Mac OS X 10.8
Re:Problema scorrimento lento Navigation Drawer
« Risposta #2 il: 27 Febbraio 2014, 10:25:29 CET »
0
Quello che conta veramente penso sia il codice dell'adapter. Puoi postarlo?

Inviato dal mio Nexus 7 utilizzando Tapatalk

Ciao si certo, anzi scusami se non l ho postato prima ma me ne sono proprio dimenticato
Codice (Java): [Seleziona]
public class NsMenuAdapter extends ArrayAdapter<NsMenuItemModel> {
        private AssetManager m;
        public NsMenuAdapter(Context context,AssetManager m) {
                super(context, 0);
                this.m=m;
        }

        public void addHeader(int title) {
                add(new NsMenuItemModel(-1, true));
        }

        public void addItem(int title, int icon) {
                add(new NsMenuItemModel(icon, false));
        }

        public void addItem(NsMenuItemModel itemModel) {
                add(itemModel);
        }

        @Override
        public int getViewTypeCount() {
                return 2;
        }

        @Override
        public int getItemViewType(int position) {
                return getItem(position).isHeader ? 0 : 1;
        }

        @Override
        public boolean isEnabled(int position) {
                return !getItem(position).isHeader;
        }

        public static class ViewHolder {
                public final ImageView imageHolder;

                public ViewHolder(ImageView image1) {
                        this.imageHolder = image1;
                }
        }


        public View getView(int position, View convertView, ViewGroup parent) {

                NsMenuItemModel item = getItem(position);
                ViewHolder holder = null;
                View view = convertView;

                if (view == null) {
                        int layout = R.layout.ns_menu_row;

                        view = LayoutInflater.from(getContext()).inflate(layout, null);

                        ImageView image1 = (ImageView) view.findViewById(R.id.menurow_icon);
                        view.setTag(new ViewHolder(image1));
                }

                if (holder == null && view != null) {
                        Object tag = view.getTag();
                        if (tag instanceof ViewHolder) {
                                holder = (ViewHolder) tag;
                        }
                }


                if(item != null && holder != null)
                {
                        if (holder.imageHolder != null) {
                                if (item.iconRes > 0) {
                                        holder.imageHolder.setVisibility(View.VISIBLE);
                                        holder.imageHolder.setImageResource(item.iconRes);
                                } else {
                                        holder.imageHolder.setVisibility(View.GONE);
                                }
                        }
                }

                return view;           
        }

Offline ciccio

  • Utente junior
  • **
  • Post: 65
  • Respect: +7
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Francesco Cervone
  • Sistema operativo:
    Mac OS X 10.9
Re:Problema scorrimento lento Navigation Drawer
« Risposta #3 il: 27 Febbraio 2014, 10:48:37 CET »
0
In questo codice non mi sembra di vedere niente di anomalo che potrebbe rallentare lo scorrimento.
L'unica cosa che mi viene da pensare è che le immagini siano troppo pesanti. Dovresti provare a comprimerle prima di creare il drawer e poi usarle. Forse la classe ThumbnailUtils può tornarti utile.
Ti ripeto però, non so se è questo il problema.

Offline Mrpaoletto

  • Nuovo arrivato
  • *
  • Post: 19
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S3
  • Sistema operativo:
    Mac OS X 10.8
Re:Problema scorrimento lento Navigation Drawer
« Risposta #4 il: 27 Febbraio 2014, 10:59:07 CET »
0
In questo codice non mi sembra di vedere niente di anomalo che potrebbe rallentare lo scorrimento.
L'unica cosa che mi viene da pensare è che le immagini siano troppo pesanti. Dovresti provare a comprimerle prima di creare il drawer e poi usarle. Forse la classe ThumbnailUtils può tornarti utile.
Ti ripeto però, non so se è questo il problema.

Le ImageView sono all'incirca 500Kb cadauna (ne sono 14), quindi non so se sia questo il problema. Magari adesso do uno sguardo anche alla classe ThumbnailUtils (se hai qualche link da passarmi te ne sarei davvero grato).....Comunque grazie mille per l'aiuto ;)

Offline ciccio

  • Utente junior
  • **
  • Post: 65
  • Respect: +7
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Francesco Cervone
  • Sistema operativo:
    Mac OS X 10.9
Re:Problema scorrimento lento Navigation Drawer
« Risposta #5 il: 27 Febbraio 2014, 11:04:05 CET »
0
Beh... 500kb*14 = 7000KB, circa 7MB, non è poco.
Dai un occhiata a questo metodo: http://developer.android.com/reference/android/media/ThumbnailUtils.html#extractThumbnail(android.graphics.Bitmap, int, int)

Gli passi un bitmap, le dimensioni e lui ti crea un'anteprima dell'immagine. Mi raccomando però, quest'operazione non la fare nel metodo getView, altrimenti non cambierà niente (anzi si rallenta ancora di più). Dovresti farlo prima di creare il navigation drawer in modo tale che nel metodo getView dovrai solo andare a prendere il Bitmap creato da extractThumbnail e metterlo nel list item.