Лучший способ обновить адаптер / ListView на Android - PullRequest
68 голосов
/ 16 ноября 2010

В моей книге «Привет, Android» рассказывается об использовании пользовательского помощника по БД, установке курсора и установке адаптера следующим образом:

Cursor cursor
CustomDatabaseHelper test = new CustomDatabaseHelper(this);
try {
        cursor = getData();
        showData(cursor);
} finally {
        test.close();
}

При этом, однако, каждый раз, когда мне нужно обновить набор данных, мне нужно продолжать запускать этот блок кода (который становится немного трудным в onClick () для кнопки из-за недоступности «this».

Это лучший способ обновить набор данных, или я должен обратить внимание на удаление .close и выдачу adapter.notifyDataSetChanged ()? Если я делаю это, иногда я получаю силу, близкую к (и я не могу вспомнить в данный момент), но иногда это не может удалить должным образом - я думаю, что это может быть, потому что база данных в настоящее время открыта, и она пытается открыть снова.

Должны ли мы также объявлять переменные для Cursors, DatabaseHelpers и Adapter в классе (вне OnCreate), чтобы они были доступны для всех функций?

Я понимаю, что на данном этапе это просто плохое программирование, но я пытаюсь получить некоторые указания относительно того, как лучше всего это делать.

Ответы [ 10 ]

94 голосов
/ 16 ноября 2010

Вы должны использовать adapter.notifyDataSetChanged().Что говорит журнал, когда вы используете это?

16 голосов
/ 14 сентября 2011

Просто добавьте этот код перед установкой Adapter, это работает для меня:

    listView.destroyDrawingCache();
    listView.setVisibility(ListView.INVISIBLE);
    listView.setVisibility(ListView.VISIBLE);

Или напрямую вы можете использовать метод ниже после изменения ресурса данных.

   adapter.notifyDataSetChanged()
13 голосов
/ 31 марта 2017

Лучший способ обновить Adapter / ListView на Android

Не только вызов notifyDataSetChanged () обновит данные ListView, setAdapter() должен быть вызван до того, какзагрузить информацию правильно:

  listView.setAdapter(adapter);
  adapter.notifyDataSetChanged();
10 голосов
/ 03 декабря 2010

Следующий код идеально подходит для меня

EfficientAdapter adp = (EfficientAdapter) QuickList.getAdapter();
adp.UpdateDataList(EfficientAdapter.MY_DATA);
adp.notifyDataSetChanged();
QuickList.invalidateViews();
QuickList.scrollBy(0, 0);
2 голосов
/ 18 октября 2018

Если ничего не работает, просто создайте экземпляр адаптера снова с новым набором результатов или обновленным набором результатов. Тогда вы можете увидеть новый вид.

XYZAdapter adbXzy = new XYZAdapter(context, 0, listData);
xyzListView.setAdapter(adbXzy);

adbXzy.notifyDataSetChanged();
1 голос
/ 29 августа 2016
adapter.notifyDataSetChanged();
0 голосов
/ 23 марта 2017

Просто напишите в своем Custom ArrayAdaper этот код:

private List<Cart_items> customListviewList ;

refreshEvents(carts);

public void refreshEvents(List<Cart_items> events)
{
    this.customListviewList.clear();
    this.customListviewList.addAll(events);
    notifyDataSetChanged();
}
0 голосов
/ 26 сентября 2016

Возможно, их проблема в том моменте, когда поиск производится в базе данных. В его циклах Fragment Override его Fragment.java, чтобы выяснить просто: попробуйте тестирование с помощью методов:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_x, container, false); //Your query and ListView code probably will be here
    Log.i("FragmentX", "Step OnCreateView");// Try with it
    return rootView; 
}

Попробуйте аналогично поставить Log.i ... "onStart" и "onResume".

Наконец, вырежьте код в "onCreate" и вставьте его в "OnStart", например:

@Override
public void onStart(){
    super.onStart();
    Log.i("FragmentX","Step OnStart");
    dbManager = new DBManager(getContext());
    Cursor cursor = dbManager.getAllNames();
    listView = (ListView)getView().findViewById(R.id.lvNames);
    adapter = new CustomCursorAdapter(getContext(),cursor,0);// your adapter
    adapter.notifyDataSetChanged();
    listView.setAdapter(adapter);
}
0 голосов
/ 29 августа 2016

просто напишите в свой Custom ArrayAdaper этот код:

public void swapItems(ArrayList<Item> arrayList) {
    this.clear();
    this.addAll(arrayList);
}
0 голосов
/ 02 марта 2016

Если вы используете LoaderManager, попробуйте следующее:

getLoaderManager().restartLoader(0, null, this);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...