android高級ui10-recycleview回收復(fù)用自定義+界面拖動效果

學(xué)習(xí)筆記,整理中;

面:

思路:

復(fù)用:從集合中去取

復(fù)用:從集合中去獲取

入口:滑動 Move 事件 --> scrollByInternal --> scrollStep --> mLayout.scrollVerticallyBy

--> scrollBy? --> fill --> layoutChunk? 布局塊--> layoutState.next 布局狀態(tài)--> addView(view);

layoutState.next --> getViewForPosition --> tryGetViewHolderForPositionByDeadline 截止日期 -->

怎么從集合中去獲取:tryGetViewHolderForPositionByDeadline,分幾種情況去獲取ViewHolder

1. getChangedScrapViewForPosition -- mChangeScrap 與動畫相關(guān)

2. getScrapOrHiddenOrCachedHolderForPosition? -- mAttachedScrap附屬廢料 炕淮、mCachedViews 緩存

3. getScrapOrCachedViewForId? -- mAttachedScrap 、mCachedViews (ViewType,itemid)

4. mViewCacheExtension.getViewForPositionAndType -- 自定義緩存 -- (使用情況:局部刷新??)

5. getRecycledViewPool().getRecycledView -- 從緩沖池里面獲取

RecycledViewPool -- 緩存池

ViewHolder -- 包裝View的 --- ItemView

當(dāng)沒有緩存的時候呐矾?悼沈?--- mAdapter.createViewHolder --》 onCreateViewHolder

多級緩存的目的 -- 為了性能

創(chuàng)建ViewHolder 后 綁定: tryBindViewHolderByDeadline--》 mAdapter.bindViewHolder--》onBindViewHolder

回收(緩存)機(jī)制:看這一個情況--- ViewHolder

LinearLayoutManager.onLayoutChildren --> detachAndScrapAttachedViews 分離--> scrapOrRecycleView

--> 1.recycler.recycleViewHolderInternal(viewHolder); -- 處理 CacheView 、RecyclerViewPool 的緩存

--> 1.ViewHodler改變 不會進(jìn)來 -- 先判斷mCachedViews的大小

--> mCachedViews.size 大于默認(rèn)大小? --- recycleCachedViewAt

--- >addViewHolderToRecycledViewPool --- 緩存池里面的數(shù)據(jù)都是從mCachedViews里面出來的

--> 2.addViewHolderToRecycledViewPool --> getRecycledViewPool().putRecycledView(holder);

--> scrap.resetInternal();? ViewHolder 清空

--> 2.recycler.scrapView(view);

mCachedViews當(dāng)前的大小 如果 大于等于mViewCacheMax(默認(rèn)的CachedViews的大小)

ViewType --

緩存池? 里面保存? 只是 ViewHolder 類型 沒有數(shù)據(jù)

去查找緩存和復(fù)用的一種情況

入口:復(fù)用:RecyclerView.onLayout --> dispatchLayout 派遣--》 dispatchLayoutStep2 --》 onLayoutChildren --》 fill

緩存:fill -->recycleByLayoutState-->recycleViewsFromStart --> recycleChildren

--> removeAndRecycleViewAt --> recycler.recycleView

--> recycler.recycleViewHolderInternal(viewHolder); -- 處理 CacheView 塞关、RecyclerViewPool 的緩存

要學(xué)會copy系統(tǒng)的代碼 --- 怎么優(yōu)化

layoutChunk --> layoutDecoratedWithMargins

notifyDataSetChanged-->mObservable.notifyChanged

--> (RecyclerViewDataObserver)mObservers.get(i).onChanged --> requestLayout


mChangeScrap與 mAttachedScrap

用來緩存還在屏幕內(nèi)的 ViewHolder

2.mCachedViews

用來緩存移除屏幕之外的 ViewHolder

3.mViewCacheExtension

開發(fā)給用戶的自定義擴(kuò)展緩存抬探,需要用戶自己管理 View 的創(chuàng)建和緩存

4.RecycledViewPool

ViewHolder 緩存池


1

—————————-

自定義layoutmanage 繼承recycleview.layout 可以實現(xiàn)布局改變 在界面上拖動或者拖拽,settranslationy拖動 setscrolx縮放

SlideCallback extends ItemTouchHelper.SimpleCallback

SlideCardLayoutManagerextends RecyclerView.LayoutManager

------------------------------------------------------------------------

public class MainActivityextends AppCompatActivity {

private RecyclerViewrv;

? ? private UniversalAdapteradapter;

? ? private ListmDatas;

? ? @Override

? ? protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

? ? ? ? setContentView(R.layout.activity_main);

? ? ? ? rv = findViewById(R.id.rv);

? ? ? ? rv.setLayoutManager(new SlideCardLayoutManager());

? ? ? ? mDatas = SlideCardBean.initDatas();

? ? ? ? adapter =new UniversalAdapter(this, mDatas, R.layout.item_swipe_card) {

@Override

? ? ? ? ? ? public void convert(ViewHolder viewHolder, SlideCardBean slideCardBean) {

viewHolder.setText(R.id.tvName, slideCardBean.getName());

? ? ? ? ? ? ? ? viewHolder.setText(R.id.tvPrecent, slideCardBean.getPostition() +"/" +mDatas.size());

? ? ? ? ? ? ? ? Glide.with(MainActivity.this)

.load(slideCardBean.getUrl())

.into((ImageView) viewHolder.getView(R.id.iv));

? ? ? ? ? ? }

};

? ? ? ? rv.setAdapter(adapter);

? ? ? ? // 初始化數(shù)據(jù)

? ? ? ? CardConfig.initConfig(this);

? ? ? ? SlideCallback slideCallback =new SlideCallback(rv, adapter, mDatas);

? ? ? ? ItemTouchHelper itemTouchHelper =new ItemTouchHelper(slideCallback);

? ? ? ? itemTouchHelper.attachToRecyclerView(rv);

? ? }

}

------------------------------------------------------------------------

public class SlideCardLayoutManagerextends RecyclerView.LayoutManager {

@Override

? ? public RecyclerView.LayoutParamsgenerateDefaultLayoutParams() {

return new RecyclerView.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,

? ? ? ? ? ? ? ? ViewGroup.LayoutParams.WRAP_CONTENT);

? ? }

// 布局

? ? @Override

? ? public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {

// ViewHodler回收復(fù)用

? ? ? ? detachAndScrapAttachedViews(recycler);

? ? ? ? int bottomPosition;

? ? ? ? int itemCount = getItemCount();

? ? ? ? if (itemCount < CardConfig.MAX_SHOW_COUNT) {

bottomPosition =0;

? ? ? ? }else {

// 布局了四張卡片 --- 4帆赢,5小压,6,7

? ? ? ? ? ? bottomPosition = itemCount - CardConfig.MAX_SHOW_COUNT;

? ? ? ? }

for (int i = bottomPosition; i < itemCount; i++) {

// 復(fù)用

? ? ? ? ? ? View view = recycler.getViewForPosition(i);

? ? ? ? ? ? addView(view);

? ? ? ? ? ? measureChildWithMargins(view, 0, 0);

? ? ? ? ? ? int widthSpace = getWidth() - getDecoratedMeasuredWidth(view);

? ? ? ? ? ? int heightSpace = getHeight() - getDecoratedMeasuredHeight(view);

? ? ? ? ? ? // 布局 ---draw -- onDraw ,onDrawOver, onLayout

? ? ? ? ? ? layoutDecoratedWithMargins(view, widthSpace /2, heightSpace /2,

? ? ? ? ? ? ? ? ? ? widthSpace /2 + getDecoratedMeasuredWidth(view),

? ? ? ? ? ? ? ? ? ? heightSpace /2 + getDecoratedMeasuredHeight(view));

? ? ? ? ? ? int level = itemCount - i -1;

? ? ? ? ? ? if (level >0) {

if (level < CardConfig.MAX_SHOW_COUNT -1) {

view.setTranslationY(CardConfig.TRANS_Y_GAP * level);

? ? ? ? ? ? ? ? ? ? view.setScaleX(1 - CardConfig.SCALE_GAP * level);

? ? ? ? ? ? ? ? ? ? view.setScaleY(1 - CardConfig.SCALE_GAP * level);

? ? ? ? ? ? ? ? }else {

// 最下面的那個view 與前一個view 布局一樣

? ? ? ? ? ? ? ? ? ? view.setTranslationY(CardConfig.TRANS_Y_GAP * (level -1));

? ? ? ? ? ? ? ? ? ? view.setScaleX(1 - CardConfig.SCALE_GAP * (level -1));

? ? ? ? ? ? ? ? ? ? view.setScaleY(1 - CardConfig.SCALE_GAP * (level -1));

? ? ? ? ? ? ? ? }

}

}

}

}

------------------------------------------------------------------------

public class SlideCallbackextends ItemTouchHelper.SimpleCallback {

private RecyclerViewmRv;

? ? private UniversalAdapteradapter;

? ? private ListmDatas;

? ? public SlideCallback(RecyclerView mRv,

? ? ? ? ? ? ? ? ? ? ? ? UniversalAdapter adapter, List mDatas) {

super(0, 15);

? ? ? ? this.mRv = mRv;

? ? ? ? this.adapter = adapter;

? ? ? ? this.mDatas = mDatas;

? ? }

// drag? 拖拽

? ? @Override

? ? public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {

return false;

? ? }

// 滑動

? ? @Override

? ? public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {

SlideCardBean remove =mDatas.remove(viewHolder.getLayoutPosition());

? ? ? ? mDatas.add(0, remove);

? ? ? ? adapter.notifyDataSetChanged();// onMeasure, onlayout

? ? }

// onDra

? ? @Override

? ? public void onChildDraw(@NonNull Canvas c, @NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {

super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);

? ? ? ? double maxDistance = recyclerView.getWidth() *0.5f;

? ? ? ? double distance = Math.sqrt(dX * dX + dY * dY);

? ? ? ? double fraction = distance / maxDistance;

? ? ? ? if (fraction >1) {

fraction =1;

? ? ? ? }

// 顯示的個數(shù)? 4個

? ? ? ? int itemCount = recyclerView.getChildCount();

? ? ? ? for (int i =0; i < itemCount; i++) {

View view = recyclerView.getChildAt(i);

? ? ? ? ? ? int level = itemCount - i -1;

? ? ? ? ? ? if (level >0) {

if (level < CardConfig.MAX_SHOW_COUNT -1) {

view.setTranslationY((float) (CardConfig.TRANS_Y_GAP * level - fraction * CardConfig.TRANS_Y_GAP));

? ? ? ? ? ? ? ? ? ? view.setScaleX((float) (1 - CardConfig.SCALE_GAP * level + fraction * CardConfig.SCALE_GAP));

? ? ? ? ? ? ? ? ? ? view.setScaleY((float) (1 - CardConfig.SCALE_GAP * level + fraction * CardConfig.SCALE_GAP));

? ? ? ? ? ? ? ? }

}

}

}

@Override

? ? public long getAnimationDuration(@NonNull RecyclerView recyclerView, int animationType, float animateDx, float animateDy) {

return 1500;

? ? }

}

------------------------------------------------------------------------

------------------------------------------------------------------------

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末椰于,一起剝皮案震驚了整個濱河市怠益,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌瘾婿,老刑警劉巖蜻牢,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異偏陪,居然都是意外死亡抢呆,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進(jìn)店門笛谦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來抱虐,“玉大人,你說我怎么就攤上這事饥脑】已” “怎么了?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵好啰,是天一觀的道長轩娶。 經(jīng)常有香客問我,道長框往,這世上最難降的妖魔是什么鳄抒? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮椰弊,結(jié)果婚禮上许溅,老公的妹妹穿的比我還像新娘。我一直安慰自己秉版,他們只是感情好贤重,可當(dāng)我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著清焕,像睡著了一般并蝗。 火紅的嫁衣襯著肌膚如雪祭犯。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天滚停,我揣著相機(jī)與錄音沃粗,去河邊找鬼。 笑死键畴,一個胖子當(dāng)著我的面吹牛最盅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播起惕,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼涡贱,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了惹想?” 一聲冷哼從身側(cè)響起问词,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎勺馆,沒想到半個月后戏售,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體侨核,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡草穆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了搓译。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片悲柱。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖些己,靈堂內(nèi)的尸體忽然破棺而出豌鸡,到底是詐尸還是另有隱情,我是刑警寧澤段标,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布涯冠,位于F島的核電站,受9級特大地震影響逼庞,放射性物質(zhì)發(fā)生泄漏蛇更。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一赛糟、第九天 我趴在偏房一處隱蔽的房頂上張望派任。 院中可真熱鬧,春花似錦璧南、人聲如沸掌逛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽豆混。三九已至篓像,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間皿伺,已是汗流浹背遗淳。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留心傀,地道東北人屈暗。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像脂男,于是被迫代替她去往敵國和親养叛。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內(nèi)容