Обнаруживать, когда 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
                    }
                })