一、開篇
距離上次寫文章已經有段時間了,說實話真不知道最近在忙些什么,現在沉下心來把最近項目中遇到的問題記錄下來便於以后遇到中使用吧!
廢話不多說,先看一下效果圖
二、需求解析
1、先說下項目需求,不管是好評還是差評下邊的Tag標簽有不同的展示類型,有的字數多的會單獨占一行處理(這邊其實也可以擴充,比如說兩三個字的可以一行顯示三個Tag標簽),第一眼看到這個需求准備使用網上的開源庫TagLayout去實現,但是嘗試了一下后發現其實他們實現的效果同項目要的效果還是有蠻大差距的,可以看到效果圖里邊是要求文字是居中對齊的,左右對稱的。
2、想到使用GridView實現這個功能,定義adapter去實現沒問題,問題是什么時候顯示一行什么時候顯示兩行三行並不能確定,畢竟有時候服務端返回的沒有類型標示只有tag_name和tag_id,你要根據什么設置類型吶,而且自從recyclerview之后現在要是還用GridView的話豈不是太落伍了。下邊就重點介紹一下使用recyclerview實現如圖效果。
三、功能實現
我們知道recyclerview實現GridView效果只需配置一下參數就行了
1
2
|
GridLayoutManager layoutManage =
new
GridLayoutManager(getContext(),
2
);
recycerView.setLayoutManager(layoutManage);
|
可以看到GridLayoutManager需要傳遞兩個參數,一個是上下文對象,另一個是一行顯示幾列的參數常量,既然這個常量可以指定那么是不是這個值可以去控制吶,答案當然是yes
我們會注意到GridLayoutManager里邊有個setSpanSizeLookup方法,本篇的重點就是這個方法(這個方法具體意義大家可以網上搜索,會有很多相關介紹,以及通過它實現一些復雜的布局,再次不做過多討論)
1
2
3
4
5
6
|
layoutManage.setSpanSizeLookup(
new
GridLayoutManager.SpanSizeLookup() {
@Override
public
int
getSpanSize(
int
position) {
return
0
;
}
});
|
其實getSpanSize返回值就是控制每行有幾列的,根據這個思路我們不妨試試。因為recyclerview填充數據是根據adapter實現的,我們就把給adapter的數據源同樣在setSpanSizeLookup這個方法里邊判斷一下不就行了嗎?
根據這個思路於是有了下面的代碼
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
/**
* 如果單個item顯示的字數大於指定某個值就顯示一列 默認2列
*/
//設置item數據大於多少字只顯示一行 默認 超過九個字的程度只顯示一列
private
static
final
int
MAX =
9
;
private
int
setSpanSize(
int
position, List<TagBean> listEntities) {
int
count;
if
(listEntities.get(position).getTag_name().length() > MAX) {
count =
2
;
}
else
{
count =
1
;
}
return
count;
}
layoutManage.setSpanSizeLookup(
new
GridLayoutManager.SpanSizeLookup() {
@Override
public
int
getSpanSize(
int
position) {
return
setSpanSize(position,list);
}
});
|
核心代碼就這么多,我們可以根據自己的需求隨意定制樣式
最后奉上源碼地址:https://github.com/lygttpod/AndroidCustomView
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家