2013-03-13 2 views
0

Я новичок в android, я хочу, чтобы получать контакты и отображать их в виде списка. Вот код i, чтобы получить контакты в asynctask.please, чтобы помочь обновить просмотр списка после извлечения каждого контакта.Как обновить listview в onProgressUpdate()

protected Void doInBackground(Void... params) { 
     ContentResolver cr = ReadContactsActivity.this.getContentResolver(); 
     Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, 
       null, null, null, null); 

     if (cur.getCount() > 0) { 
      while (cur.moveToNext()) { 
       String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID)); 
       String name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 
       if (Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) { 
        Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null, 
              ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?", 
              new String[]{id}, null); 
        while (pCur.moveToNext()) { 
          String phone = pCur.getString(
            pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
         //li.add("Name:"+name+",Number:"+phone); 
          publishProgress("Name:"+name+",Number:"+phone); 
        } 
        pCur.close(); 
        } 
       } 
      } 
     return null; 
    } 


    // A callback method executed on UI thread, invoked by the publishProgress() 
    // from doInBackground() method 
    @Override 
    protected void onProgressUpdate(String... values) { 
     list=(ListView) findViewById(R.id.lvDisplay); 
     ArrayAdapter<String> adp=new ArrayAdapter<String> 
     (getBaseContext(),R.layout.list,R.id.label,li); 
     list.setAdapter(adp);  
    } 

ответ

6

Как вы используете свои списки и адаптеры совершенно не работает.

  • Не используйте findViewById каждый раз, хранить ссылку на него вместо
  • Не устанавливайте новый адаптер каждый раз, вместо того, чтобы изменить исходные данные и вызвать
  • Всегда делайте ваши один раз набор взлетов (получение ссылка на ListView, инициализирует адаптер и т.д ..) в OnPreExecute

    ListView list; 
    List<String> names; 
    ArrayAdapter<string> adapter; 
    
    @Override 
    protected void onPreExecute() { 
        names = new ArrayList<String>(); 
        list = (ListView) findViewById(R.id.lvDisplay); 
        ArrayAdapter<String> adapter = new ArrayAdapter<String>  
         (getBaseContext(), 
         R.layout.list, 
         R.id.label, 
         names); 
        list.setAdapter(adp); 
    } 
    
    // doInBackground() ... 
    
    @Override 
    protected void onProgressUpdate(String... values) { 
        names.add(values[0]) 
        adapter.notifyDataSetChanged(); 
    } 
    

Примечания: в этом случае я бы на самом деле Рек исправьте, что вы храните ссылки для адаптера, listView и базовых данных за пределами AsyncTask. Вы можете использовать эти ссылки, и у вас также есть возможность использовать их в своем внешнем классе, когда это необходимо (что очень вероятно)

+0

этот код не сообщает Адаптеру, что он должен использовать список имен. Я предлагаю использовать 'adapter.add (значения [0]); adapter.notifyDataSetChanged(); 'in onProgressUpdate – Dodge

+0

Фактически, поскольку адаптер использует имена ArrayList , мы можем просто добавить имя в arraylist и попросить адаптер обновить. –

+0

ОК, но вам все равно нужно добавить 'names = new ArrayList ();' :) – Dodge

1

Положите его в onPostExecute(), как этот

@Override 
    protected void onPostExecute(String... values) { 
     super.onPostExecute(result); 
     list=(ListView) findViewById(R.id.lvDisplay); 
    ArrayAdapter<String> adp=new ArrayAdapter<String> 
    (getBaseContext(),R.layout.list,R.id.label,li); 
    list.setAdapter(adp); 
    } 
+0

Это будет выполняться, когда все записи будут извлечены, но мне нужно обновить представление списка при каждом изложении – Supreet

1

UPDATE: Ахмед зафиксировал свой ответ ... https://stackoverflow.com/a/15381932/1659588

на основании ответа Ахмеда Aeon Axan здесь фиксированная версия

ListView list; 
ArrayAdapter<string> adapter; 

@Override 
protected void onPreExecute() { 
    list = (ListView) findViewById(R.id.lvDisplay); 
    ArrayAdapter<String> adapter = new ArrayAdapter<String>  
     (getBaseContext(),R.layout.list,R.id.label,li); 
     list.setAdapter(adp); 
} 

// doInBackground() ... 

@Override 
protected void onProgressUpdate(String... values) { 
    adapter.add(values[0]); 
    adapter.notifyDataSetChanged(); 
} 

+0

. Это дает ошибку «Метод add (R.string) в типе ArrayAdapter не применим для аргументов (String)», пожалуйста, помогите как исправить – Supreet

+1

Используйте обновленный ответ Ahmed Aeon Axan http://stackoverflow.com/a/15381932/1659588 – Dodge

Смежные вопросы