32

我想知道什么时候BaseAdapter.notifyDataSetChanged()完成,然后做一些事情。我的代码:

BaseAdapter.notifyDataSetChanged();  
mScroller.startScroll(oldX, 0, dx, 0);

mScroller完成前滚动 notifyDataSetChanged()。我想在完成后mScroller滚动到。oldXnotifyDataSetChanged()

请帮帮我,谢谢。

4

5 回答 5

9

BaseAdapter支持注册一个DataSetObserver可以监听onChanged事件的位置,而不是扩展。

notifyDataSetChanged方法将导致此事件触发。

adapter.registerDataSetObserver(new DataSetObserver() {
    @Override
    public void onChanged() {
        // ...
    }
});

...

adapter.notifyDataSetChanged();
于 2018-08-16T20:49:34.390 回答
2

我有同样的问题,试试这个对我来说非常有效。您正在覆盖方法 notifyDataSetChanged()。您可以在 Adapter 类中执行此操作。只需复制我发布的代码并将我 setSelection() 的行替换为您需要做的任何事情。

@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。在适配器的构造函数中,我传入了 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)
于 2018-02-23T06:33:32.700 回答
1

这已经晚了,但可能对以后来的人有帮助。

如果你熟悉RxJava2Completable,你可以检测notifyDataSetChanged()到 UI 上的任何操作是否完成。

        Completable.fromAction {
            // notifyDataSetChanged() here
        }
                .subscribe(object : DisposableCompletableObserver() {
                    override fun onComplete() {
                        recyclerView.scrollTo(position)
                    }

                    override fun onError(e: Throwable) {
                        // handle error here
                    }
                })
于 2019-05-19T04:36:48.197 回答
0

我遇到了同样的问题,我最终这样做了-

 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
于 2017-03-14T08:20:34.423 回答
0

请参阅以下(更现代的)带有 kotlin 扩展功能的实现:

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()
}
于 2021-10-21T09:56:58.913 回答