android - studio - Detectar cuando BaseAdapter.notifyDataSetChanged() finalizó
notifydatasetchanged not working (4)
Quiero saber cuándo BaseAdapter.notifyDataSetChanged()
y luego realiza la prueba de sonido. Mi código:
BaseAdapter.notifyDataSetChanged();
mScroller.startScroll(oldX, 0, dx, 0);
mScroller
desplaza antes de que notifyDataSetChanged()
finalice. Quiero que mScroller
desplace a oldX
después de que notifyDataSetChanged()
termine.
Por favor ayúdame, gracias.
En lugar de ampliar, BaseAdapter
admite el registro de un DataSetObserver
donde puede escuchar el evento onChanged
.
El método notifyDataSetChanged
provocará que este evento se notifyDataSetChanged
.
adapter.registerDataSetObserver(new DataSetObserver() {
@Override
public void onChanged() {
// ...
}
});
...
adapter.notifyDataSetChanged();
Estaba teniendo el mismo problema y termino haciendo esto.
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
Esto es tarde pero podría ser útil para cualquiera que venga después.
Si está familiarizado con RxJava2
y Completable
, puede detectar si notifyDataSetChanged()
o cualquier operación en la interfaz de usuario ha finalizado.
Completable.fromAction {
// notifyDataSetChanged() here
}
.subscribe(object : DisposableCompletableObserver() {
override fun onComplete() {
recyclerView.scrollTo(position)
}
override fun onError(e: Throwable) {
// handle error here
}
})
Tuve el mismo problema exacto, prueba esto funcionó perfectamente para mí. Está anulando el método notifyDataSetChanged (). Haces esto en tu clase de Adaptador. Simplemente copie el código que publiqué y reemplace la línea donde establecíSelección () con lo que necesite hacer.
@Override
public void notifyDataSetChanged()
{
super.notifyDataSetChanged();
parentGlobal.setSelection(this.getCount() - 1); //This is how we start Activity fully scrolled to bottom
}
Dicho esto, en caso de que se esté preguntando, "parentGlobal" es el ListView al que configuré el Adaptador en mi Actividad. En el constructor del adaptador, pasé en el ListView y luego lo hice "global". Pido disculpas si "global" no es un término de Java, vengo de un mundo de C ++.
// entra en actividad:
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);
// va en adaptador
public Adapter_Conversation(AppCompatActivity activity, @LayoutRes int resource,
ArrayList<Adapter_GetSet_Conversation> list_conversation, ListView lv_main,
int item_margin_px)