我想知道BaseAdapter.notifyDataSetChanged()
何时结束,并随后执行某些操作。我的代码:
BaseAdapter.notifyDataSetChanged();
mScroller.startScroll(oldX, 0, dx, 0);
mScroller
在notifyDataSetChanged()
完成之前就已滚动,我希望在notifyDataSetChanged()
完成后将mScroller
滚动到oldX
。
请帮忙,谢谢。
我想知道BaseAdapter.notifyDataSetChanged()
何时结束,并随后执行某些操作。我的代码:
BaseAdapter.notifyDataSetChanged();
mScroller.startScroll(oldX, 0, dx, 0);
mScroller
在notifyDataSetChanged()
完成之前就已滚动,我希望在notifyDataSetChanged()
完成后将mScroller
滚动到oldX
。
请帮忙,谢谢。
与其扩展,BaseAdapter
支持注册一个 DataSetObserver
,在那里您可以侦听 onChanged
事件。
notifyDataSetChanged
方法会触发此事件。
adapter.registerDataSetObserver(new DataSetObserver() {
@Override
public void onChanged() {
// ...
}
});
...
adapter.notifyDataSetChanged();
onChanged()
方法被多次调用,而不仅仅是在视图布局完成时。 - PJ_Finnegan我曾经遇到过完全相同的问题,尝试这个方法后对我非常有效。您需要重写方法notifyDataSetChanged(),在适配器类中完成此操作。只需复制我发布的代码,并将其中设置选择的行替换为您需要执行的任何操作即可。
@Override
public void notifyDataSetChanged()
{
super.notifyDataSetChanged();
parentGlobal.setSelection(this.getCount() - 1); //This is how we start Activity fully scrolled to bottom
}
说了这么多,如果你想知道,“parentGlobal”是我在Activity中设置Adapter的ListView。在Adapter的构造函数中,我传入了ListView并将其设为“全局”的。如果“全局”不是Java术语,我很抱歉,因为我来自C++世界。
//放在Activity中:
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)
fun <VH : ViewHolder> RecyclerView.Adapter<VH>.notifyDataSetChanged(
completion: () -> Unit
) {
val adapter = this
val observer = object : RecyclerView.AdapterDataObserver() {
override fun onChanged() {
super.onChanged()
adapter.unregisterAdapterDataObserver(this)
completion.invoke()
}
}
registerAdapterDataObserver(observer)
notifyDataSetChanged()
}
我曾经遇到过同样的问题,最终我做了这个-
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