a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁(yè) > 系統(tǒng) > Android > 正文

Android仿qq分組管理的第三方庫(kù)

2019-10-21 21:35:01
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

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

下面先看效果 

Android,qq分組,第三方庫(kù)

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

下面直接上核心代碼

首先定義分組的對(duì)象,相當(dāng)于上面紅色字體的對(duì)象,跟分組下每個(gè)item的對(duì)象;
創(chuàng)建分組的ViewHolder繼承第三方庫(kù)的ParentViewHolder,代碼如下(由于父類沒有無(wú)參構(gòu)造,所以必須實(shí)現(xiàn)父類的一個(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)完成一半了,剩下的類想必大家都不陌生,就是adapter,有列表的View,就得有adapter來(lái)綁定數(shù)據(jù),下面直接上代碼,也是繼承第三方庫(kù)的adapter,所以我們根本不用想要寫什么方法,只有把要實(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)的,其實(shí)細(xì)心的人已經(jīng)注意到,分別就是每個(gè)分組的對(duì)象,子item對(duì)象,還有就是分組跟子item的ViewHolder。還有其他4個(gè)方法就更好理解了,可以說(shuō)是見名識(shí)意,就不多做解釋了。

應(yīng)用

不知大家有沒意識(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)畫。實(shí)現(xiàn)也是十分簡(jiǎn)單,只要在TeamViewHolder中重寫父類的一個(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) {   // 由展開到收起狀態(tài)   ra = new RotateAnimation(     ROTATED_POSITION, // 展開狀態(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)畫的實(shí)現(xiàn)。需要講解一下的是,setExpanded()這個(gè)方法在內(nèi)部已經(jīng)幫我們調(diào)用了,傳進(jìn)去的參數(shù)為true時(shí),說(shuō)明該分組是打開的,false則表示該分組沒打開,只要根據(jù)這個(gè)值做相關(guān)的處理,就可以得到想要的效果。

總結(jié)

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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持VEVB武林網(wǎng)。


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到Android開發(fā)頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 国产一区二区三区四区在线观看 | 欧美一区二区三区黄 | 草久在线视频 | 国产精品高颜值在线观看 | 久久久99精品免费观看 | 国产精品毛片一区二区 | 日本黄色a级 | 热久久久久 | 久久综合影院 | 午夜视频91 | 青青av| 日本一区二区不卡 | 黄色网址在线免费观看 | 久久久国产一区二区三区 | 一区二区激情 | 成人精品网站在线观看 | 黄网站免费在线观看 | 一本色道久久88综合亚洲精品ⅰ | 中文字幕 视频一区 | 综合 欧美 亚洲日本 | 超碰人人爱 | 99久久婷婷国产综合精品电影 | 欧美日韩国产高清视频 | 欧美一级在线 | 一区二区在线免费观看 | 精品久久中文字幕 | 国产乱人伦av在线a 日韩电影中文字幕 | 少妇久久久 | 黄色小视频在线观看 | 狠狠综合| 羞羞网站在线观看 | 欧美精品网站 | 久久精品国产精品亚洲 | 成人黄色在线视频 | 日本一区二区三区四区不卡视频 | 亚洲精品一区久久久久久 | 精品国产髙清在线看国产毛片 | 青草视频在线播放 | 久久久麻豆 | 国产精品理论在线观看 | 在线观看日韩av |