Подтвердить что ты не робот

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

Моя книга "Hello Android" дает это как способ использования пользовательского помощника db, настройки курсора, а затем настройки адаптера следующим образом:

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

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

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

   adapter.notifyDataSetChanged()

Ответ 3

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

EfficientAdapter adp = (EfficientAdapter) QuickList.getAdapter();
adp.UpdateDataList(EfficientAdapter.MY_DATA);
adp.notifyDataSetChanged();
QuickList.invalidateViews();
QuickList.scrollBy(0, 0);

Ответ 4

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

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

  listView.setAdapter(adapter);
  adapter.notifyDataSetChanged();

Ответ 5

Если вы используете LoaderManager, попробуйте с этим утверждением:

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

Ответ 6

adapter.notifyDataSetChanged();

Ответ 7

Возможно, их проблема - это момент, когда поиск производится в базе данных. В его циклах переопределения фрагментов его 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);
}

Ответ 8

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

private List<Cart_items> customListviewList ;

refreshEvents(carts);

public void refreshEvents(List<Cart_items> events)
{
    this.customListviewList.clear();
    this.customListviewList.addAll(events);
    notifyDataSetChanged();
}

Ответ 9

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

public void swapItems(ArrayList<Item> arrayList) {
    this.clear();
    this.addAll(arrayList);
}