0

Ich habe zwei Loader. Zuerst lädt man SMS in meine DB. Der zweite lädt SMS von meinem DB zum Cursoradapter. Und ich habe meine listView erst aktualisiert, nachdem alle SMS in meine DB eingefügt wurden.ListView aktualisiert erst nach alle geladenen SMS

Hier Ladern und Adapter:

... 
    private static final int SMS_LOADER = 0; 
    private static final int MY_DB_LOADER = 1; 
    MyCursorAdapter mAdapter; 
... 

Hier ist initLoader 's in onCreate:

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
... 
     ListView listView = (ListView) findViewById(R.id.list); 
     mAdapter = new MyCursorAdapter(this, null); 
     listView.setAdapter(mAdapter); 
... 
     getSupportLoaderManager().initLoader(SMS_LOADER, null, this); 
     getSupportLoaderManager().initLoader(MY_DB_LOADER, null, this); 
    } 

Hier ist onCreateLoader mit 2 Lader:

@Override 
    public Loader<Cursor> onCreateLoader(int id, Bundle args) { 
     switch (id) { 
      case SMS_LOADER: { 
       String[] projection = { 
         BaseColumns._ID, 
         Telephony.TextBasedSmsColumns.DATE_SENT, 
         Telephony.TextBasedSmsColumns.BODY 
       }; 

       return new CursorLoader(this, 
         BASE_CONTENT_URI, 
         projection, 
         null, 
         null, 
         null); 
      } 
      case MY_DB_LOADER: { 
       String[] projection = { 
         MyEntry._ID, 
         MyEntry.COLUMN_1, 
         MyEntry.COLUMN_2 
       }; 

       return new CursorLoader(this, 
         MyEntry.CONTENT_URI, 
         projection, 
         null, 
         null, 
         null); 
      } 
      default: 
       Log.e(LOG_TAG, "Unsupported id " + id); 
       return null; 
     } 
    } 

In onLoadFinished I' m gehe SMS Cursor und füge in meine DB ein:

@Override 
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) { 
     int id = loader.getId(); 
     switch (id) { 
      case SMS_LOADER: 
       while (data.moveToNext()) { 
        int columnIndexDateSent = data.getColumnIndex(Telephony.TextBasedSmsColumns.DATE_SENT); 
        int columnIndexBody = data.getColumnIndex(Telephony.TextBasedSmsColumns.BODY); 

        String date = data.getString(columnIndexDateSent); 
        String body = data.getString(columnIndexBody); 

        ContentValues values = new ContentValues(); 

        values.put(MyEntry.COLUMN_1, date); 
        values.put(MyEntry.COLUMN_2, body); 

        getContentResolver().insert(MyEntry.CONTENT_URI, values); 
       } 
       break; 
      case MY_DB_LOADER: 
       mAdapter.swapCursor(data); 
       break; 
      default: 
       Log.e(LOG_TAG, "Unsupported id " + id); 
     } 
    } 

Ich denke, es ist kein richtiger Ort ist Einsätze zu machen, verursachen Android Studio sagen halten:

Die Anwendung zu viel Arbeit sein kann auf seinem Haupt-Thread zu tun.

Wohin soll ich diese Einsätze bewegen? Wie kann man listView nach dem Einfügen der ersten Zeile in die DB aktualisieren?

Antwort

0

Dieses Problem gelöst. Erstellte neue Klasse FillDB extends AsyncTask, verschobenen Code, der DB in doInBackground füllt und new FillDB().execute(data); in onLoadFinished aufgerufen.

Verwandte Themen