2016-05-10 9 views
0

Ich habe eine App, die Artikel von einem sql database auf meinem Handy lädt, was ich tue ich lade die Artikel von der onResume() Methode, aber Dinge nicht seine effizienteste Art zu sehen, kann ich immer sehen die Gegenstände laden, während ich andere Anwendungen wie whatsApp oder contacts App sehe, kann man nicht einmal die Gegenstände sehen, die geladen werden. Mit meiner derzeitigen Art zu laden ist meine App nicht nur langsam, sondern macht auch unnötige Verarbeitung, gibt es einen besseren, effizienteren Weg, den jeder kennt, den ich implementieren kann? Vielen Dank im Voraus.Lade Recycler/Listview Artikel effizient

Überblick über meine SQL-Datenbank-Klasse:

public class Database extends SQLiteOpenHelper { 

//My list that holds my database items(which in my case is receipts) 
private ArrayList<Receipt> allReceipts = new ArrayList<>(); 

    public ArrayList<Receipt> getAllReceipts() { 
    try { 
     allReceipts.clear(); 

     // Select All Query 
     String selectQuery = "SELECT * FROM " + Constants.RECEIPT_TABLE; 

     SQLiteDatabase db = this.getWritableDatabase(); 
     Cursor cursor = db.rawQuery(selectQuery, null); 

     // looping through all rows and adding to list 
     if(cursor != null) 
     if (cursor.moveToFirst()) { 
      do { 

       Receipt receipt = new Receipt(); 
       receipt.setId(Integer.parseInt(cursor.getString(0))); 
       receipt.setMerchantName(cursor.getString(1)); 
       receipt.setPrice(cursor.getString(2)); 
       // Adding contact to list 
       allReceipts.add(receipt); 
      } while (cursor.moveToNext()); 
     } 


     if(cursor != null) 
     cursor.close(); 
     db.close(); 
     return allReceipts; 
    } catch (Exception e) { 
     // TODO: handle exception 
     Log.e("all_receipts", "" + e); 
    } 

    return allReceipts; 
} 

Mein Fragment Empfang der Quittungen

private void initRecycler() 
{ 
    Action<List<ParentListItem>> action = new Action<List<ParentListItem>>() { 

     @NonNull 
     @Override 
     public String id() { 
      // Return a unique ID. 
      return "load all receipts"; 
     } 
     @Nullable 
     @Override 
     protected List<ParentListItem> run() throws InterruptedException { 
      receiptArrayList = database.getAllReceipts(); 
      return getReceipts(); 
     } 

     @Override 
     protected void done(@Nullable final List<ParentListItem> receipts) { 
      progress.stop(); 

      assert receipts != null; 
      if(receipts.isEmpty()) { 



      }else { 

       childAdapterListeners(); 



       adapter = new ReceiptExpandableAdapter(getContext(), receipts, onItemClickListenerCheckBtn, onItemClickListenerDeleteBtn, mOntemClickListenerViewBtn); 
       recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); 
       // recyclerView.addItemDecoration(new DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL_LIST)); 
       recyclerView.setAdapter(adapter); 

      } 
     } 
    }; 
    action.execute(); 
    } 



    @Override 
public void onResume() 
{ 
    initRecycler(); 
    super.onResume(); 

} 
+0

Es ist wirklich eine breite Frage, viele Faktoren gibt es? Kannst du den Code posten? – varunkr

+0

in einem Moment bitte – Chrometobia

+0

versuchen, eine begrenzte Anzahl von Datensätzen (Seiten) zu holen. Rufen Sie die nächsten vorherigen Seiten nur dann ab, wenn der Benutzer zu ihnen blättert. –

Antwort

0

Haben Sie versucht, erstreckt CursorLoader? Dies ist die effizienteste und korrekteste Methode zum Auffüllen von Listen mit Datenbankdaten.

+0

Könnten Sie bitte weiter erklären – Chrometobia

+0

Natürlich. Finden Sie hier http://developer.android.com/training/load-data-background/setup-loader.html#InitializeLoader – daxgirl

+0

Dies ist die effizienteste Möglichkeit zum Laden von Elementen aus dem Cursor. Auch es ist Google empfohlen. Wie es Cursor bei Konfigurationsänderungen verwaltet. Sie können die Methode swapCursor ganz einfach zu Ihrem Recyclerview-Adapter hinzufügen. – daxgirl