日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android -- 处理ViewPager的notifyDataSetChanged无刷新

發布時間:2024/4/17 Android 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android -- 处理ViewPager的notifyDataSetChanged无刷新 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Viewpager在調用notifyDataSetChanged()時,界面無刷新

Viewpager在調用notifyDataSetChanged()時,界面無刷新,它確實影響我們功能的實現了。可能選擇為Viewpager重新設置一遍適配器adapter,達到刷新的目的。但是這種方法在大多數情況下,是有問題的。

查看方法

super.notifyDataSetChanged()調用的是PagerAdapter.notifyDataSetChanged()

/*** This method should be called by the application if the data backing this adapter has changed* and associated views should update.*/public void notifyDataSetChanged() {mObservable.notifyChanged();}

注釋里說到,當附加在適配器上的數據發生變化時,應該調用該方法刷新數據。該方法調用了一個mObservable .notifyChanged();

我們繼續跟進這個方法,進入DataSetObservable類中,發現這樣一段代碼:

/*** Invokes {@link DataSetObserver#onChanged} on each observer.* Called when the contents of the data set have changed. The recipient* will obtain the new contents the next time it queries the data set.*/public void notifyChanged() {synchronized(mObservers ) {// since onChanged() is implemented by the app, it could do anything, including// removing itself from {@link mObservers} - and that could cause problems if// an iterator is used on the ArrayList {@link mObservers}.// to avoid such problems, just march thru the list in the reverse order.for (int i = mObservers .size() - 1; i >= 0; i--) {mObservers.get(i).onChanged();}}}

這都不是重點,重點我們來看這個mObservers的類型是一個抽象類DataSetObserver,里面只有兩個未實現的方法,都有誰使用了這個抽象類呢,其中我們發現了Viewpager的身影。進入viewpager,我們終于找到了viewpager中控制數據變更的重點方法dataSetChanged ,這個方法如下:

void dataSetChanged () {// This method only gets called if our observer is attached, so mAdapter is non-null.boolean needPopulate = mItems .size() < mOffscreenPageLimit * 2 + 1 &&mItems.size() < mAdapter.getCount();int newCurrItem = mCurItem ;boolean isUpdating = false;for (int i = 0; i < mItems.size(); i++) {final ItemInfo ii = mItems .get(i);final int newPos = mAdapter.getItemPosition(ii.object );if (newPos == PagerAdapter.POSITION_UNCHANGED ) {continue;}if (newPos == PagerAdapter.POSITION_NONE) {mItems.remove(i);i--;if (!isUpdating) {mAdapter.startUpdate( this);isUpdating = true;}mAdapter.destroyItem( this, ii.position , ii.object);needPopulate = true;if (mCurItem == ii.position ) {// Keep the current item in the valid rangenewCurrItem = Math. max(0, Math.min(mCurItem, mAdapter.getCount() - 1));needPopulate = true;}continue;}if (ii.position != newPos) {if (ii.position == mCurItem ) {// Our current item changed position. Follow it.newCurrItem = newPos;}ii. position = newPos;needPopulate = true;}}if (isUpdating) {mAdapter.finishUpdate( this);}Collections. sort(mItems, COMPARATOR);if (needPopulate) {// Reset our known page widths; populate will recompute them.final int childCount = getChildCount();for (int i = 0; i < childCount; i++) {final View child = getChildAt(i);final LayoutParams lp = (LayoutParams) child.getLayoutParams();if (!lp.isDecor ) {lp. widthFactor = 0.f;}}setCurrentItemInternal(newCurrItem, false, true);requestLayout();}}

重點看這樣一行代碼:

final int newPos = mAdapter.getItemPosition(ii.object );if (newPos == PagerAdapter.POSITION_UNCHANGED ) {continue ;}

? Called when the host view is attempting to determine if an item’s position has changed. Returns?POSITION_UNCHANGED?if the position of the given item has not changed orPOSITION_NONE?if the item is no longer present in the adapter.

The default implementation assumes that items will never change position and always returnsPOSITION_UNCHANGED.

意思是如果item的位置如果沒有發生變化,則返回POSITION_UNCHANGED。如果返回了POSITION_NONE,表示該位置的item已經不存在了。默認的實現是假設item的位置永遠不會發生變化,而返回POSITION_UNCHANGED

解決方案

所以我們可以嘗試著修改適配器的寫法,覆蓋getItemPosition()方法,當調用notifyDataSetChanged時,讓getItemPosition方法人為的返回POSITION_NONE,從而達到強迫viewpager重繪所有item的目的。

class SearchAdapter extends PagerAdapter {private int mChildCount = 0;@Overridepublic void notifyDataSetChanged() { mChildCount = getCount();super.notifyDataSetChanged();}@Overridepublic int getItemPosition(Object object) { if ( mChildCount > 0) {mChildCount --;return POSITION_NONE;}return super.getItemPosition(object);}}

我是天王蓋地虎的分割線




本文轉自我愛物聯網博客園博客,原文鏈接:http://www.cnblogs.com/yydcdut/p/4232614.html,如需轉載請自行聯系原作者

總結

以上是生活随笔為你收集整理的Android -- 处理ViewPager的notifyDataSetChanged无刷新的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。