2012-09-11 21 views
5

Attualmente sto sviluppando un frammento che contiene elenchi di album. La struttura è piuttosto semplice:Come caricare i frammenti più velocemente?

Il dispositivo di scorrimento orizzontale contiene LinearLayour (orizzontale). Per aggiungere un album con la lista dei brani, ho creato una vista separata che consiste in un'immagine di copertina e una listview. La listview è anche personalizzata dove gli oggetti sono linearlayout con 3 textview. Poi lo gonfio, popolo la lista e aggiungo al cursore Orizzontale.

Il problema si verifica se ho più di 2 elenchi di album. Ci vuole del tempo per aprire un frammento.

Un'altra cosa è quando provo a scorrere (orizzontalmente), a volte si ferma per un breve momento, il che rende l'esperienza utente negativa.

Quello che sto cercando di dire è che ho visto viste simili e funzionano velocemente e senza ritardi. È possibile in qualche modo ottimizzarlo? Oppure è possibile in modo che il frammento si apra subito e poi le liste vengano caricate in seguito (tipo di lazyload).

LISTVIEW ARTICOLO:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal" 
    android:background="#ccffffff" 
    android:padding="10dp" > 

     <TextView 
      android:id="@+id/album_list_item_number" 
      android:layout_width="30dp" 
      android:layout_height="wrap_content" 
      android:text="" 
      android:gravity="center|center_vertical" 
      android:layout_gravity="center|center_vertical" 
      android:textColor="#333333" 
      android:textAppearance="?android:attr/textAppearanceMedium" /> 





     <TextView 
      android:id="@+id/album_list_item_title" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:text="" 
      android:layout_weight="1" 
      android:gravity="left|center_vertical" 
      android:layout_gravity="left|center_vertical" 
      android:textColor="#333333" 
      android:textAppearance="?android:attr/textAppearanceMedium" /> 

     <TextView 
      android:id="@+id/album_list_item_time" 
      android:layout_width="90dp" 
      android:layout_height="wrap_content" 
      android:text="" 
      android:gravity="center|center_vertical" 
      android:layout_gravity="center|center_vertical" 
      android:textColor="#333333" 
      android:textAppearance="?android:attr/textAppearanceMedium" /> 

</LinearLayout> 

che popolano la LISTA e aggiungendo VISTA ORIZZONTALE SLIDER:

View albumView = inflater.inflate(R.layout.artist_album_col, container, false); 
    //setting cover 
    ImageView albumCover = (ImageView) albumView.findViewById(R.id.artistAlbumCover); 
    albumCover.setImageDrawable(getResources().getDrawable(R.drawable.albumcover)); //cover 

    ListView albumList = (ListView) albumView.findViewById(R.id.artistSongList); 


    // create the grid item mapping 
    String[] from = new String[] {"num", "title", "time"}; 
    int[] to = new int[] { R.id.album_list_item_number, R.id.album_list_item_title, R.id.album_list_item_time}; 

    // prepare the list of all records 
    List<HashMap<String, String>> fillMaps = new ArrayList<HashMap<String, String>>(); 
    for(int i = 0; i < 24; i++){ 
     HashMap<String, String> map = new HashMap<String, String>(); 
     map.put("num", "" + i); 
     map.put("title", "title title title title title title title title title " + i); 
     map.put("time", "time " + i); 
     fillMaps.add(map); 
    } 

    // fill in the grid_item layout 
    SimpleAdapter adapter = new SimpleAdapter(mContext, fillMaps, R.layout.album_list_item, from, to); 
    albumList.setAdapter(adapter); 

    albumContainer.addView(albumView); 
+0

è possibile fornire codice sufficiente per vedere come si creano i frammenti e gli adattatori in modo che la comunità SO possa essere in grado di esaminarla e fornire suggerimenti appropriati? – petey

+0

Usa Traceview per capire dove viene speso il tuo tempo. – CommonsWare

risposta

0

È possibile utilizzare Async Task per eseguire le attività in termini di tempo e portarli fuori dal thread UI . Ciò consentirà il caricamento rapido del frammento e l'elenco popolato "pigramente".

chiamata con:

new LoadingTask().execute(""); 

E si può attaccare una classe come questo nella vostra classe di frammento (avvertimento non testato!):

private class LoadingTask extends AsyncTask<Void, Void, Void> { 
    SimpleAdapter adapter; 

    protected void doInBackground(Void... values) { 

     // do your work in background thread 
     // create the grid item mapping      
     String[] from = new String[] {"num", "title", "time"};      
     int[] to = new int[] { R.id.album_list_item_number, R.id.album_list_item_title, R.id.album_list_item_time}; 

     // prepare the list of all records       
     List<HashMap<String, String>> fillMaps = new ArrayList<HashMap<String, String>>();       
     for(int i = 0; i < 24; i++){        
     HashMap<String, String> map = new HashMap<String, String>();        
     map.put("num", "" + i);        
     map.put("title", "title title title title title title title title title " + i);        
     map.put("time", "time " + i);        
     fillMaps.add(map);       
    }            
    // fill in the grid_item layout       
    adapter = new SimpleAdapter(mContext, fillMaps, R.layout.album_list_item, from, to); 
     return; 
    } 

    protected void onPostExecute(Void value) { 

     // back in UI thread after task is done 
     ListView albumList = (ListView) getActivity().findViewById(R.id.artistSongList);  
     albumList.setAdapter(adapter); 
    } 
} 

Un altro esempio here.

+1

Il ritardo che ho descritto sembra essere correlato alla visualizzazione dei dati e alla mancata visualizzazione. Quindi, anche usando AsynTask, si fermerà per un secondo quando si verifica onPostExecute. –

Problemi correlati