Обнаруживать, когда BaseAdapter.notifyDataSetChanged() завершено
Я хочу знать, когда BaseAdapter.notifyDataSetChanged()
закончить, а потом сделать что-то. Мой код:
BaseAdapter.notifyDataSetChanged();
mScroller.startScroll(oldX, 0, dx, 0);
Прокрутка
mScroller
до notifyDataSetChanged()
завершается. Я хочу, чтобы mScroller
прокручивался до oldX
после завершения notifyDataSetChanged()
.
Пожалуйста, помогите мне, спасибо.
Ответы
Ответ 1
Вместо расширения BaseAdapter
поддерживает регистрацию DataSetObserver
где вы можете прослушивать событие onChanged
.
Метод notifyDataSetChanged
вызовет это событие.
adapter.registerDataSetObserver(new DataSetObserver() {
@Override
public void onChanged() {
// ...
}
});
...
adapter.notifyDataSetChanged();
Ответ 2
У меня была точно такая же проблема, попробуйте, она отлично сработала для меня. Вы переопределяете метод notifyDataSetChanged(). Вы делаете это в своем классе Адаптера. Просто скопируйте код, который я разместил, и замените строку, в которой я установилSelection(), на все, что вам нужно.
@Override
public void notifyDataSetChanged()
{
super.notifyDataSetChanged();
parentGlobal.setSelection(this.getCount() - 1); //This is how we start Activity fully scrolled to bottom
}
С учетом вышесказанного, если вам интересно, "parentGlobal" - это ListView, для которого я установил Адаптер в своей Деятельности. В конструкторе Адаптера я передал ListView, а затем сделал его "глобальным". Я прошу прощения, если "глобальный" не является термином Java, я из мира C++.
//Переходит в активность:
lv_main = (ListView) findViewById(R.id.listView_conversation);
adapter_main = new Adapter_Conversation(ConversationActivity.this, R.layout.layout_list_conversation,
list_main_UI, lv_main, main_list_item_margin_px);
lv_main.setAdapter(adapter_main);
//Заходит в адаптер
public Adapter_Conversation(AppCompatActivity activity, @LayoutRes int resource,
ArrayList<Adapter_GetSet_Conversation> list_conversation, ListView lv_main,
int item_margin_px)
Ответ 3
У меня была та же проблема, и я в итоге делаю это -
BaseAdapter.notifyDataSetChanged();
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
mScroller.startScroll(oldX, 0, dx, 0);
//write scroll code here
}
},50); //scroll after 50ms
Ответ 4
Это поздно, но может быть полезно для всех, кто придет позже.
Если вы знакомы с RxJava2
и Completable
, вы можете определить, notifyDataSetChanged()
ли notifyDataSetChanged()
или какая-либо операция с пользовательским интерфейсом.
Completable.fromAction {
// notifyDataSetChanged() here
}
.subscribe(object : DisposableCompletableObserver() {
override fun onComplete() {
recyclerView.scrollTo(position)
}
override fun onError(e: Throwable) {
// handle error here
}
})