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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

android qq分组展开,Android仿qq分组管理的第三方库

發(fā)布時(shí)間:2024/10/12 Android 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android qq分组展开,Android仿qq分组管理的第三方库 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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

下面先看效果

我們點(diǎn)擊展開與折疊分組的功能在庫里面是已經(jīng)封裝好的,只能把它已入到項(xiàng)目中,就可以直接用了,十分的方便。

下面直接上核心代碼

首先定義分組的對象,相當(dāng)于上面紅色字體的對象,跟分組下每個item的對象;

創(chuàng)建分組的ViewHolder繼承第三方庫的ParentViewHolder,代碼如下(由于父類沒有無參構(gòu)造,所以必須實(shí)現(xiàn)父類的一個有參構(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);

}

}

既然有每個分組的ViewHolder,就會有每個分組下面子item的ViewHolder,下面就來創(chuàng)建該ViewHolder,實(shí)現(xiàn)方式跟上面是一樣的,連名字也是十分的明確,一個是parent,一個是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之后,可以說功能已經(jīng)完成一半了,剩下的類想必大家都不陌生,就是adapter,有列表的View,就得有adapter來綁定數(shù)據(jù),下面直接上代碼,也是繼承第三方庫的adapter,所以我們根本不用想要寫什么方法,只有把要實(shí)現(xiàn)的方法實(shí)現(xiàn)了,就完事:

public class TeamAdapter extends ExpandableRecyclerAdapter {

private final LayoutInflater mInflater;

/**

* Primary constructor. Sets up {@link #mParentList} and {@link #mFlatItemList}.

*

* 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 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個泛型類,是不是瞬間蒙了,心里肯定想這是什么來的,其實(shí)細(xì)心的人已經(jīng)注意到,分別就是每個分組的對象,子item對象,還有就是分組跟子item的ViewHolder。還有其他4個方法就更好理解了,可以說是見名識意,就不多做解釋了。

應(yīng)用

不知大家有沒意識到,上面用的adapter是RecyclerView的adapter,那我們用來顯示列表的view也就用recyclerview,recyclerview的用法也不難,就是調(diào)用幾個方法初始化,然后再設(shè)置adapter就完成了數(shù)據(jù)的綁定,而現(xiàn)在說得分組的顯示跟平時(shí)調(diào)用recyclerview基本是一樣的,唯一不同的就是要對數(shù)據(jù)源做一定的處理(數(shù)據(jù)使用的例子是球隊(duì)與球員,即team是球隊(duì),player是球員,每個球隊(duì)相當(dāng)與一個分組,而每個分組下就有自己的球員):

// 首先要給recyclerview設(shè)置一個布局管理器

recyclerView.setLayoutManager(new LinearLayoutManager(this));

// 第一個球隊(duì)的所有球員

List players1 = new ArrayList<>();

// 第二個球隊(duì)的所有球員

List players2 = new ArrayList<>();

// 第三個球隊(duì)的所有球員

List players3 = new ArrayList<>();

// 所有球隊(duì)的集合

List teams = new ArrayList<>();

// 創(chuàng)建每個球隊(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)可以顯示了,效果就跟上面的圖一樣,但是每個分組后面的箭頭是不會動的,接下來就是給箭頭添加旋轉(zhuǎn)動畫。實(shí)現(xiàn)也是十分簡單,只要在TeamViewHolder中重寫父類的一個方法就行了,當(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) {

// 由展開到收起狀態(tài)

ra = new RotateAnimation(

ROTATED_POSITION, // 展開狀態(tài)角度

INITIAL_POSITION, // 收起狀態(tài)角度

RotateAnimation.RELATIVE_TO_SELF, // 相對于自己的中心點(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)動畫的實(shí)現(xiàn)。需要講解一下的是,setExpanded()這個方法在內(nèi)部已經(jīng)幫我們調(diào)用了,傳進(jìn)去的參數(shù)為true時(shí),說明該分組是打開的,false則表示該分組沒打開,只要根據(jù)這個值做相關(guān)的處理,就可以得到想要的效果。

總結(jié)

這個第三方庫的可以說是極其的方便,邏輯也不難,而且主要的用法也介紹完了。只要結(jié)合例子,理解下代碼,很容易就可以拿來就用,也很感謝寫這些優(yōu)秀代碼的第三方庫的作者的分享,希望大家有發(fā)掘到優(yōu)秀的源碼都拿出來一起分享、探討!

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

總結(jié)

以上是生活随笔為你收集整理的android qq分组展开,Android仿qq分组管理的第三方库的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。