2016-11-09 2 views
1

Ich habe ein Problem in meiner App. Es ist ein Telefonbuch. Nach der Verwendung von AsyncTask ändern sich alle Farben!Geändert Farben nach der Verwendung von AsyncTask

Dies ist Screenshot vor AsyncTask mit:

enter image description here

Dies ist Screenshot nach AsyncTask mit:

enter image description here

Was ist falsch mit meiner app?

1: Mein Code (mit AsyncTask):

public class MainActivity extends Activity { 
ArrayList<Contact> contacts; 
private ContactAdapter contactAdapter; 
private DbWorker db; 
private ListView listView; 
private Context context; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    listView = (ListView) findViewById(R.id.listview); 

    context = getApplicationContext(); 
    new DbAsyncTask(context).execute(); 

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      Intent intent = new Intent(MainActivity.this, ChangeContactActivity.class); 
      Contact contact = contactAdapter.getContact(position); 
      intent.putExtra("name", contact.getContactName()); 
      intent.putExtra("phone", contact.getContactPhone()); 
      intent.putExtra("category", contact.getContactCategory()); 
      intent.putExtra("org", contact.getContactOrgName()); 
      intent.putExtra("id", contact.getContactId()); 

      startActivity(intent); 
     } 
    }); 

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
    fab.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Intent intent = new Intent(MainActivity.this, AddContactActivity.class); 
      startActivity(intent); 
     } 
    }); 

} 

class DbAsyncTask extends AsyncTask<Void, Void, ArrayList<Contact>> { 
    private Context ctx; 

    public DbAsyncTask(Context ctx){ 
     this.ctx = ctx; 
    } 

    @Override 
    protected ArrayList<Contact> doInBackground(Void... params) { 
     db = new DbWorker(ctx); 
     contacts = (ArrayList<Contact>) db.selectAllContacts(); 
     return contacts; 
    } 

    @Override 
    protected void onPostExecute(ArrayList<Contact> contacts) { 
     contactAdapter = new ContactAdapter(ctx, contacts); 

     listView.setAdapter(contactAdapter); 
    } 
} 

}

Ohne AsyncTask Ich verpflichte:

listView = (ListView) findViewById(R.id.listview); 
context = getApplicationContext(); 
new DbAsyncTask(context).execute(); 

und fügen:

db = new DbWorker(this); 
listView = (ListView) findViewById(R.id.listview); 
contacts = (ArrayList<Contact>) db.selectAllContacts(); 
contactAdapter = new ContactAdapter(this, contacts); 
listView.setAdapter(contactAdapter); 

Antwort

0

Sie übergeben den Anwendungskontext an Ihren Async, der keine Ahnung von Ihrem Thema/Stil hat. Stattdessen sollten Sie den Aktivitätskontext verwenden, der die erforderlichen Informationen zum Thema/Stil besitzt.

Daher ersetzen:

context = getApplicationContext(); 

Mit folgendem:

context = this; /*here 'this' refers to your activity's context*/ 
+1

Oder grundsätzlich neue 'DbAsyncTask (this) .execute();' –

+0

@MuratK. Ja, sicher. aber ich dachte, die kleinste Änderung zu beantworten :) – waqaslam

+0

@waqaslam. Danke – Krabs

Verwandte Themen