Ответ 1
Вы должны использовать adapter.notifyDataSetChanged()
. Что говорят журналы при использовании?
Моя книга "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), чтобы они были доступны для всех функций?
Я понимаю, что это просто плохое программирование на этом этапе, но я пытаюсь получить некоторые указания относительно наилучшего способа сделать что-то.
Вы должны использовать adapter.notifyDataSetChanged()
. Что говорят журналы при использовании?
Просто добавьте этот код перед установкой Adapter
, он работает для меня:
listView.destroyDrawingCache();
listView.setVisibility(ListView.INVISIBLE);
listView.setVisibility(ListView.VISIBLE);
Или Непосредственно вы можете использовать метод ниже после изменения ресурса данных.
adapter.notifyDataSetChanged()
Следующий код работает идеально для меня
EfficientAdapter adp = (EfficientAdapter) QuickList.getAdapter();
adp.UpdateDataList(EfficientAdapter.MY_DATA);
adp.notifyDataSetChanged();
QuickList.invalidateViews();
QuickList.scrollBy(0, 0);
Лучший способ обновить адаптер /ListView на Android
Не только вызов notifyDataSetChanged() обновит данные ListView, перед тем, как правильно загрузить информацию, необходимо вызвать setAdapter()
:
listView.setAdapter(adapter);
adapter.notifyDataSetChanged();
Если вы используете LoaderManager, попробуйте с этим утверждением:
getLoaderManager().restartLoader(0, null, this);
adapter.notifyDataSetChanged();
Возможно, их проблема - это момент, когда поиск производится в базе данных. В его циклах переопределения фрагментов его 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);
}
Просто напишите в своем Custom ArrayAdaper
этот код:
private List<Cart_items> customListviewList ;
refreshEvents(carts);
public void refreshEvents(List<Cart_items> events)
{
this.customListviewList.clear();
this.customListviewList.addAll(events);
notifyDataSetChanged();
}
просто напишите в своем Custom ArrayAdaper этот код:
public void swapItems(ArrayList<Item> arrayList) {
this.clear();
this.addAll(arrayList);
}