Android仿qq分組管理的第三方庫(kù)
本文實(shí)例為大家分享了Android仿qq分組管理的第三方庫(kù),供大家參考,具體內(nèi)容如下
下面先看效果

我們點(diǎn)擊展開(kāi)與折疊分組的功能在庫(kù)里面是已經(jīng)封裝好的,只能把它已入到項(xiàng)目中,就可以直接用了,十分的方便。
下面直接上核心代碼
首先定義分組的對(duì)象,相當(dāng)于上面紅色字體的對(duì)象,跟分組下每個(gè)item的對(duì)象;
創(chuàng)建分組的ViewHolder繼承第三方庫(kù)的ParentViewHolder,代碼如下(由于父類(lèi)沒(méi)有無(wú)參構(gòu)造,所以必須實(shí)現(xiàn)父類(lèi)的一個(gè)有參構(gòu)造,傳入的參數(shù)相信大家也很清楚):
/**
* 分組的ViewHolder
*/
public class TeamViewHolder extends ParentViewHolder {
/**
* Default constructor.
*
* @param itemView The {@link View} being hosted in this ViewHolder
*/
public TeamViewHolder(@NonNull View itemView) {
super(itemView);
}
}
既然有每個(gè)分組的ViewHolder,就會(huì)有每個(gè)分組下面子item的ViewHolder,下面就來(lái)創(chuàng)建該ViewHolder,實(shí)現(xiàn)方式跟上面是一樣的,連名字也是十分的明確,一個(gè)是parent,一個(gè)是child:
public class PlayerViewHolder extends ChildViewHolder {
private final TextView mIngredientTextView;
/**
* Default constructor.
*
* @param itemView The {@link View} being hosted in this ViewHolder
*/
public PlayerViewHolder(@NonNull View itemView) {
super(itemView);
mIngredientTextView = ((TextView) itemView.findViewById(R.id.ingredient_textview));
}
}
創(chuàng)建完ViewHolder之后,可以說(shuō)功能已經(jīng)完成一半了,剩下的類(lèi)想必大家都不陌生,就是adapter,有列表的View,就得有adapter來(lái)綁定數(shù)據(jù),下面直接上代碼,也是繼承第三方庫(kù)的adapter,所以我們根本不用想要寫(xiě)什么方法,只有把要實(shí)現(xiàn)的方法實(shí)現(xiàn)了,就完事:
public class TeamAdapter extends ExpandableRecyclerAdapter<Team, Player, TeamViewHolder, PlayerViewHolder> {
private final LayoutInflater mInflater;
/**
* Primary constructor. Sets up {@link #mParentList} and {@link #mFlatItemList}.
* <p>
* Any changes to {@link #mParentList} should be made on the original instance, and notified via
* {@link #notifyParentInserted(int)}
* {@link #notifyParentRemoved(int)}
* {@link #notifyParentChanged(int)}
* {@link #notifyParentRangeInserted(int, int)}
* {@link #notifyChildInserted(int, int)}
* {@link #notifyChildRemoved(int, int)}
* {@link #notifyChildChanged(int, int)}
* methods and not the notify methods of RecyclerView.Adapter.
*
* @param parentList List of all parents to be displayed in the RecyclerView that this
* adapter is linked to
*/
public TeamAdapter(Context context, @NonNull List<Team> parentList) {
super(parentList);
mInflater = LayoutInflater.from(context);
}
@NonNull
@Override
public TeamViewHolder onCreateParentViewHolder(@NonNull ViewGroup parentViewGroup, int viewType) {
View view = mInflater.inflate(R.layout.team_view, parentViewGroup, false);
return new TeamViewHolder(view);
}
@NonNull
@Override
public PlayerViewHolder onCreateChildViewHolder(@NonNull ViewGroup childViewGroup, int viewType) {
View view = mInflater.inflate(R.layout.player_view, childViewGroup, false);
return new PlayerViewHolder(view);
}
@Override
public void onBindParentViewHolder(@NonNull TeamViewHolder parentViewHolder, int parentPosition, @NonNull Team parent) {
parentViewHolder.bind(parent);
}
@Override
public void onBindChildViewHolder(@NonNull PlayerViewHolder childViewHolder, int parentPosition, int childPosition, @NonNull Player child) {
childViewHolder.bind(child);
}
}
大家看到繼承時(shí)要傳入4個(gè)泛型類(lèi),是不是瞬間蒙了,心里肯定想這是什么來(lái)的,其實(shí)細(xì)心的人已經(jīng)注意到,分別就是每個(gè)分組的對(duì)象,子item對(duì)象,還有就是分組跟子item的ViewHolder。還有其他4個(gè)方法就更好理解了,可以說(shuō)是見(jiàn)名識(shí)意,就不多做解釋了。
應(yīng)用
不知大家有沒(méi)意識(shí)到,上面用的adapter是RecyclerView的adapter,那我們用來(lái)顯示列表的view也就用recyclerview,recyclerview的用法也不難,就是調(diào)用幾個(gè)方法初始化,然后再設(shè)置adapter就完成了數(shù)據(jù)的綁定,而現(xiàn)在說(shuō)得分組的顯示跟平時(shí)調(diào)用recyclerview基本是一樣的,唯一不同的就是要對(duì)數(shù)據(jù)源做一定的處理(數(shù)據(jù)使用的例子是球隊(duì)與球員,即team是球隊(duì),player是球員,每個(gè)球隊(duì)相當(dāng)與一個(gè)分組,而每個(gè)分組下就有自己的球員):
// 首先要給recyclerview設(shè)置一個(gè)布局管理器 recyclerView.setLayoutManager(new LinearLayoutManager(this)); // 第一個(gè)球隊(duì)的所有球員 List<Player> players1 = new ArrayList<>(); // 第二個(gè)球隊(duì)的所有球員 List<Player> players2 = new ArrayList<>(); // 第三個(gè)球隊(duì)的所有球員 List<Player> players3 = new ArrayList<>(); // 所有球隊(duì)的集合 List<Team> teams = new ArrayList<>(); // 創(chuàng)建每個(gè)球隊(duì),傳入的參數(shù)是隊(duì)名跟隊(duì)員 Team team = new Team(teamNames[0], players1); Team team2 = new Team(teamNames[1], players2); Team team3 = new Team(teamNames[2], players3); teams.add(team); teams.add(team2); teams.add(team3); // adapter傳入的數(shù)據(jù)源是所有球隊(duì)的集合 TeamAdapter adapter = new TeamAdapter(this, teams); recyclerView.setAdapter(adapter);
到這里,數(shù)據(jù)已經(jīng)可以顯示了,效果就跟上面的圖一樣,但是每個(gè)分組后面的箭頭是不會(huì)動(dòng)的,接下來(lái)就是給箭頭添加旋轉(zhuǎn)動(dòng)畫(huà)。實(shí)現(xiàn)也是十分簡(jiǎn)單,只要在TeamViewHolder中重寫(xiě)父類(lèi)的一個(gè)方法就行了,當(dāng)然,里面的旋轉(zhuǎn)邏輯是根據(jù)實(shí)際情況去實(shí)現(xiàn)的:
private static final float INITIAL_POSITION = -90F;
private static final float ROTATED_POSITION = 0.0F;
@Override
public void setExpanded(boolean expanded) {
super.setExpanded(expanded);
RotateAnimation ra;
if (!expanded) {
// 由展開(kāi)到收起狀態(tài)
ra = new RotateAnimation(
ROTATED_POSITION, // 展開(kāi)狀態(tài)角度
INITIAL_POSITION, // 收起狀態(tài)角度
RotateAnimation.RELATIVE_TO_SELF, // 相對(duì)于自己的中心點(diǎn)
0.5f,
Animation.RELATIVE_TO_SELF,
0.5f);
} else {
ra = new RotateAnimation(
INITIAL_POSITION,
ROTATED_POSITION,
Animation.RELATIVE_TO_SELF,
0.5f,
Animation.RELATIVE_TO_SELF,
0.5f);
}
ra.setDuration(200);
ra.setFillAfter(true);
mArrowExpandImageView.startAnimation(ra);
}
我這里實(shí)現(xiàn)的就是上圖的效果,其實(shí)就是旋轉(zhuǎn)動(dòng)畫(huà)的實(shí)現(xiàn)。需要講解一下的是,setExpanded()這個(gè)方法在內(nèi)部已經(jīng)幫我們調(diào)用了,傳進(jìn)去的參數(shù)為true時(shí),說(shuō)明該分組是打開(kāi)的,false則表示該分組沒(méi)打開(kāi),只要根據(jù)這個(gè)值做相關(guān)的處理,就可以得到想要的效果。
總結(jié)
這個(gè)第三方庫(kù)的可以說(shuō)是極其的方便,邏輯也不難,而且主要的用法也介紹完了。只要結(jié)合例子,理解下代碼,很容易就可以拿來(lái)就用,也很感謝寫(xiě)這些優(yōu)秀代碼的第三方庫(kù)的作者的分享,希望大家有發(fā)掘到優(yōu)秀的源碼都拿出來(lái)一起分享、探討!
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android?Flutter使用本地?cái)?shù)據(jù)庫(kù)編寫(xiě)備忘錄應(yīng)用
這篇文章主要為大家詳細(xì)介紹了Android?Flutter如何使用本地?cái)?shù)據(jù)庫(kù)實(shí)現(xiàn)編寫(xiě)簡(jiǎn)單的備忘錄應(yīng)用,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-03-03
實(shí)例解析Android ImageView的scaleType屬性
通過(guò)本文給大家介紹ImageView這個(gè)控件的一些使用方法,以及其最重要的一個(gè)屬性: scaleType,對(duì)imageview的scaletype相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧2016-01-01
Android中的RecyclerView新組件初步上手指南
RecyclerView是Android L版本開(kāi)始采用的一個(gè)組件,被人們認(rèn)為用來(lái)代替?zhèn)鹘y(tǒng)的ListView,下面我們就一起來(lái)看一下Android中的RecyclerView新組件初步上手指南2016-06-06
Android?PowerManagerService?打開(kāi)省電模式
這篇文章主要介紹了Android?PowerManagerService打開(kāi)省電模式,文章通告省電模式的打開(kāi)過(guò)程、什么是?battery?saver?sticky?模式兩部分展開(kāi)詳情,感興趣的朋友可以參考一下2022-08-08
View觸發(fā)機(jī)制API實(shí)現(xiàn)GestureDetector OverScroller詳解
這篇文章主要為大家介紹了View觸發(fā)機(jī)制API實(shí)現(xiàn)GestureDetector OverScroller詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
android的got表HOOK實(shí)現(xiàn)代碼
對(duì)于android的so文件的hook根據(jù)ELF文件特性分為:Got表hook、Sym表hook和inline hook等。今天通過(guò)本文給大家介紹android HOOK實(shí)現(xiàn)got表的實(shí)例代碼,需要的朋友參考下吧2021-08-08
Android 使用Vitamio打造自己的萬(wàn)能播放器(8)——細(xì)節(jié)優(yōu)化
本文主要介紹Android Vitamio開(kāi)發(fā)播放器,這里給大家提供了一些小的細(xì)節(jié)優(yōu)化,更加完善播放器的功能,希望能幫助有需要的小伙伴2016-07-07
Android開(kāi)發(fā)之選項(xiàng)卡功能的實(shí)現(xiàn)方法示例
這篇文章主要介紹了Android開(kāi)發(fā)之選項(xiàng)卡功能的實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了Android選項(xiàng)卡功能的原理、實(shí)現(xiàn)技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下2017-06-06

