亚洲精品一二区_国产黄色片网站_99久久久成人国产精品_蜜臀网_国产精品一区二区三区免费_成人av中文字幕_91精品国产欧美一区二区成人

當(dāng)前位置:首頁 > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > RecyclerView學(xué)習(xí)筆記(二)——實現(xiàn)GridView

RecyclerView學(xué)習(xí)筆記(二)——實現(xiàn)GridView 時間:2018-09-26      來源:未知

RecycleView和ListView一樣,都是做列表顯示View子項的控件,它比ListView更高效和自由。

解析RecycleView,Recycle View意思就是該控件只管回收和顯示View子項,而對于如何顯示,顯示什么,它是不關(guān)心的,這給開發(fā)過程帶來了極大的便利,比如ListView只能作為單列的列表顯示,GridView將一個界面表格化,通常情況下GridView通過強制View子項的寬度來顯示,在橫豎屏切換時的效果很差。

而RecycleView可以實現(xiàn):

ListView的功能

GridView的功能

橫向ListView的功能

橫向ScrollView的功能

瀑布流的功能

添加和刪除View子項

這些功能,非常強大,可以看出,它幾乎可以替代所有的動態(tài)布局控件。

這么強大的動態(tài)布局控件,得益于它的高度解耦,同樣,眾所周知,高度解耦,就意味著復(fù)雜度提升,相較于ListView、GridView等控件,RecycleView才實現(xiàn)過程是相對較復(fù)雜的。

RecyclerView的適配器需要繼承自RecyclerView.Adapter,在該適配器將要面向ViewHolder,也就是說,它內(nèi)部已經(jīng)實現(xiàn)了緩存復(fù)用。

實現(xiàn)GridView功能

已經(jīng)實現(xiàn)了ListView,對于一個高度解耦的RecyclerView來說,再實現(xiàn)GridView的功能就非常簡單了。

新建RecyclerViewDemo2工程。Adapter可以直接拷貝RecyclerViewDemo1中的內(nèi)容。暫時不考慮分隔線的情況下,只需要將實現(xiàn)ListView時使用的LinnerLayoutManager換成GridLayoutManager即可,只需要改動兩行代碼。

Java Code

GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 4);

recyclerView.setLayoutManager(gridLayoutManager);

非常的方便,那么,在一個界面中通過判斷屏幕方向,使用不同的顯示方式,也就順理成章了。

其他的東西都是不變的,除了布局管理器的改變之外,另一個需要注意的就是分隔線,需要重新繪制。

Java Code

package com.hqyj.dev.recyclerviewdemo2;

import android.content.Context;

import android.content.res.TypedArray;

import android.graphics.Canvas;

import android.graphics.Rect;

import android.graphics.drawable.Drawable;

import android.support.v7.widget.GridLayoutManager;

import android.support.v7.widget.RecyclerView;

import android.support.v7.widget.StaggeredGridLayoutManager;

import android.util.Log;

import android.view.View;

/**

* Created by jiyangkang on 2016/7/16 0016.

*/

public class GridItemDecoration extends

RecyclerView.ItemDecoration {

private Drawable mDivider;

private static final int[] ATTRS = new int[]{

android.R.attr.listDivider

};

public GridItemDecoration(Context context) {

final TypedArray t = context.obtainStyledAttributes(ATTRS);

mDivider = t.getDrawable(0);

t.recycle();

}

@Override

public void onDraw(Canvas c,

RecyclerView parent,

RecyclerView.State state) {

super.onDraw(c, parent, state);

drawHorizontal(c, parent);

drawVertical(c, parent);

}

//獲取列數(shù)

private int getSpanCount(RecyclerView parent) {

int spandCount = -1;

RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();

if (layoutManager instanceof GridLayoutManager) {

spandCount = ((GridLayoutManager) layoutManager).getSpanCount();

} else if (layoutManager instanceof StaggeredGridLayoutManager) {

spandCount = (

(StaggeredGridLayoutManager) layoutManager).getSpanCount();

}

return spandCount;

}

private void drawVertical(Canvas c, RecyclerView parent) {

final int childCount = parent.getChildCount();

for (int i = 0; i < childCount; i++) {

Log.d("Draw_v", "drawVertical: " + i);

final View child = parent.getChildAt(i);

final RecyclerView.LayoutParams params = (

RecyclerView.LayoutParams) child.getLayoutParams();

final int top = child.getTop() - params.topMargin;

final int bottom = child.getBottom() + params.bottomMargin;

final int left = child.getRight();

final int right = left + mDivider.getIntrinsicWidth();

mDivider.setBounds(left, top, right, bottom);

mDivider.draw(c);

}

}

private void drawHorizontal(Canvas c, RecyclerView parent) {

int childCount = parent.getChildCount();

for (int i = 0; i < childCount; i++) {

Log.d("Draw_h", "drawVertical: " + i);

final View child = parent.getChildAt(i);

final RecyclerView.LayoutParams params = (

RecyclerView.LayoutParams) child.getLayoutParams();

final int left = child.getLeft() - params.leftMargin;

final int right = child.getRight() + params.rightMargin

+ mDivider.getIntrinsicWidth();

final int top = child.getBottom() + params.bottomMargin;

final int bottom = top + mDivider.getIntrinsicHeight();

mDivider.setBounds(left, top, right, bottom);

mDivider.draw(c);

}

}

@Override

public void getItemOffsets(Rect outRect,

View view,

RecyclerView parent,

RecyclerView.State state) {

super.getItemOffsets(outRect, view, parent, state);

outRect.set(0,0,mDivider.getIntrinsicWidth(), mDivider.getIntrinsicHeight());

}

}

對View子項的操作和仿制ListView的時候是一致的。

上一篇:異步通信和同步通信簡單對比

下一篇:二維數(shù)組與行指針

熱點文章推薦
華清學(xué)員就業(yè)榜單
高薪學(xué)員經(jīng)驗分享
熱點新聞推薦
前臺專線:010-82525158 企業(yè)培訓(xùn)洽談專線:010-82525379 院校合作洽談專線:010-82525379 Copyright © 2004-2022 北京華清遠(yuǎn)見科技集團有限公司 版權(quán)所有 ,京ICP備16055225號-5京公海網(wǎng)安備11010802025203號

回到頂部

主站蜘蛛池模板: 久久在线免费 | 亚洲国产欧美在线成人aaaa | 动漫在线观看免费网站资源 | 久久精品一本到99热免费 | 青青久精品观看视频最新 | 国产靠逼视频 | 日韩欧美在线观看一区 | 午夜性色一区二区三区不卡视频 | 久久精品国语 | 日韩在线视频不卡 | 2020年福利免费视频 | 国产精品免费看久久久麻豆 | 日日摸狠狠的摸夜夜摸 | 欧美精品一区二区三区免费观看 | 欧美一级做一级爱a做片性 欧美一卡二卡三卡 | 亚洲a在线播放 | 久久国产精品二区99 | 国产一区二区在线观看麻豆 | 韩国一区二区三区视频 | 99亚洲精品高清一二区 | 欧美刺激午夜性久久久久久久 | 国产高清美女一级a毛片 | 日本高清色本在线www | 日韩在线高清 | 精品女同一区二区三区免费播放 | 在线观看亚洲天堂 | 日本午夜大片 | 日本欧美一区二区三区 | 免费福利在线播放 | 日日摸夜夜添夜夜添一区二区 | 国产成都一二三四区 | 人人澡人人擦人人免费 | 高清国产一区二区三区 | 一级毛片成人免费看a | 亚洲国产人久久久成人精品网站 | 99热这里只有免费国产精品 | 另类在线 | 欧美黑人又粗又长 | 欧美性插视频 | 毛片免费看看 | 欧美日韩综合在线视频免费看 |