2016-05-26 4 views
3

Я сделал собственное listview с пользовательским адаптером, который заполнен из базы данных. Я не могу обновлять свой список при каждом изменении данных из базы данных. Я уже пробовал использовать notifysetdatachanged(), но это не сработало. Может быть, это потому, что я неправильно сформулировал код. Пожалуйста, помогите мне решить эту проблему. Благодарю.Как обновить список в пользовательском адаптере?

ContactActivity.java

public void getImages2(){ 
 
     class GetImages2 extends AsyncTask<Void,Void,Void>{ 
 
      @Override 
 
      protected void onPreExecute() { 
 
       super.onPreExecute(); 
 

 
      } 
 

 
      @Override 
 
      protected void onPostExecute(Void v) { 
 
       super.onPostExecute(v); 
 
       loading.dismiss(); 
 
       customList = new CustomList(ContactActivity.this,GetAlImages2.imageURLs,GetAlImages2.bitmaps,GetAlImages2.code,GetAlImages2.name,GetAlImages2.phone,GetAlImages2.email); 
 
       listView.setAdapter(customList); 
 
       customList.notifyDataSetChanged(); 
 
    
 
       } 
 
      @Override 
 
      protected Void doInBackground(Void... voids) { 
 
       try { 
 
        getAlImages2.getAllImages2(); 
 

 
       } catch (JSONException e) { 
 
        e.printStackTrace(); 
 
       } 
 
       return null; 
 
      } 
 
     } 
 
     GetImages2 getImages = new GetImages2(); 
 
     getImages.execute(); 
 
    }

CustomList.java

public class CustomList extends ArrayAdapter<String> { 
 
    private Bitmap[] bitmaps; 
 
    private String[] urls; 
 
    private String[] code; 
 
    private String[] name; 
 
    private String[] email; 
 
    private String[] phone; 
 

 
    private Activity context; 
 

 
    public CustomList(Activity context, String[] urls, Bitmap[] bitmaps, String[] code, String[] name, String[] phone, String[] email) { 
 
     super(context, R.layout.activity_contact_item, urls); 
 
     this.context = context; 
 
     this.urls= urls; 
 
     this.bitmaps= bitmaps; 
 
     this.code= code; 
 
     this.name= name; 
 
     this.phone= phone; 
 
     this.email = email; 
 
    } 
 

 
}

[EDIT]

Наконец-то я нашел решение своей проблемы. Сначала мне нужно было проверить, не является ли адаптер listview пустым или нет. Я добавил этот код в свой onPostExecute. Спасибо за вашу помощь.

customList = new CustomList(ContactActivity.this,GetAlImages2.imageURLs,GetAlImages2.bitmaps,GetAlImages2.code,GetAlImages2.name,GetAlImages2.phone,GetAlImages2.email); 
 
if(listView.getAdapter() == null){ //Adapter not set yet. 
 
    listView.setAdapter(customList); 
 
} 
 
else{ //Already has an adapter 
 
    listView.setAdapter(customList); 
 
    customList.notifyDataSetChanged(); 
 
    listView.invalidateViews(); 
 
    listView.refreshDrawableState(); 
 
}

+0

данные настройки в ListView или нет ?? –

ответ

1

Попробуйте

Внутри вашей onResume() добавить этот

if (listvew!= null) { 
    listvew.invalidateViews(); 
} 
adapter.notifyDataSetChanged(); 
+0

Я пробовал свой код, а затем у меня возникла ошибка. java.lang.RuntimeException: не удается возобновить действие {com.irmaelita.bpsgosurvey/com.irmaelita.bpsgosurvey.ContactActivity}: java.lang.NullPointerException: попытка вызвать виртуальный метод 'void com.irmaelita.bpsgosurvey.CustomList.notifyDataSetChanged() ». Что мне теперь делать? –

+0

если мой ответ полезен другим, пожалуйста, подтвердите свой ответ @ IrmaElita – YUVRAJ

1

пожалуйста, попробуйте эти

new Handler().post(new Runnable() { 
    @Override 
    public void run() { 
     // Code here will run in UI thread 
     adapter.notifyDataSetChanged(); 
    } 
}); 

ИЛИ

someActivity.runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
     adapter.notifyDataSetChanged(); 
     } 
}); 
+0

Я поместил ваш первый код в свой onPostExecute, но он не сработал. Он не обновил список. Я сделал что-то не так? –

0

Я думаю, что вам нужно реализовать загрузчик обратного вызова для деятельности, которая содержит ListView .. и вы можете следить за этот ответ Listview not updating after database update and adapter.notifyDataSetChanged();

более распространенный способ закодировать это:

Добавить этот интерфейс для вашей деятельности:

public class MyActivity extends Activity implementsLoaderManager.LoaderCallbacks<Cursor> 

в onCreate, установите УРАФ тер (обратите внимание, что курсор находится нуль в этой точке):

String[] from = new String[] { TodoTable.COLUMN_SUMMARY, TodoTable.COLUMN_ID}; 
int[] to = new int[] { R.id.label }; 
adapter = new SimpleCursorAdapter(this, R.layout.todo_row, null, from, to, 0); //Note that the cursor is null 
lw.setAdapter(adapter); 

Инициировать погрузчик:

getLoaderManager().initLoader(0, null, this); 

Это вызывает onCreateLoader в фоновом потоке (так что если ваш запрос долго работает это не будет блокировать поток пользовательского интерфейса). Когда он заканчивается, onLoadFinished вызывается в потоке пользовательского интерфейса, где вы можете поменять новый курсор.

После выполнения удаления или обновления, перезагрузите загрузчик:

getLoaderManager().restartLoader(0, null, this); 

Это вызывает onLoaderReset, который удаляет существующий курсор из адаптера, а затем вызывает onCreateLoader снова поменять на новый.

Наконец добавить эти методы:

public Loader<Cursor> onCreateLoader(int id, Bundle args) 
{ 
    String[] from = new String[] { TodoTable.COLUMN_SUMMARY, TodoTable.COLUMN_ID}; 
    String where = TodoTable.COLUMN_DELETED + " = ?"; 

    Loader<Cursor> loader = new CursorLoader(this, TodoContentProvider.CONTENT_URI, from, where, new String[] {"0"}, null);  
    return loader; 
} 

public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) 
{ 
    adapter.swapCursor(cursor); 
} 

public void onLoaderReset(Loader<Cursor> loader) 
{ 
    adapter.swapCursor(null); 
} 
+0

Я новичок. И я не знаю, как реализовать этот код для моего кода. Не могли бы вы показать мне, как это сделать? –

+0

См. Обновленный ответ сейчас – Shruti

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