Android仿qq分組管理的第三方庫

這篇文章主要爲大家詳細介紹了Android仿qq分組管理的第三方庫,具有一定的參考價值,感興趣的小夥伴們可以參考一下

本文實例爲大家分享了Android仿qq分組管理的第三方庫,供大家參考,具體內容如下

下面先看效果 

我們點擊展開與摺疊分組的功能在庫裏面是已經封裝好的,只能把它已入到項目中,就可以直接用了,十分的方便。

下面直接上核心代碼

首先定義分組的對象,相當於上面紅色字體的對象,跟分組下每個item的對象;
創建分組的ViewHolder繼承第三方庫的ParentViewHolder,代碼如下(由於父類沒有無參構造,所以必須實現父類的一個有參構造,傳入的參數相信大家也很清楚):

/**
 * 分組的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,下面就來創建該ViewHolder,實現方式跟上面是一樣的,連名字也是十分的明確,一個是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));
 }
}

創建完ViewHolder之後,可以說功能已經完成一半了,剩下的類想必大家都不陌生,就是adapter,有列表的View,就得有adapter來綁定數據,下面直接上代碼,也是繼承第三方庫的adapter,所以我們根本不用想要寫什麼方法,只有把要實現的方法實現了,就完事:

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);
 }
}

大家看到繼承時要傳入4個泛型類,是不是瞬間蒙了,心裏肯定想這是什麼來的,其實細心的人已經注意到,分別就是每個分組的對象,子item對象,還有就是分組跟子item的ViewHolder。還有其他4個方法就更好理解了,可以說是見名識意,就不多做解釋了。

應用

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

// 首先要給recyclerview設置一個佈局管理器
recyclerView.setLayoutManager(new LinearLayoutManager(this));

// 第一個球隊的所有球員
List<Player> players1 = new ArrayList<>();
// 第二個球隊的所有球員
List<Player> players2 = new ArrayList<>();
// 第三個球隊的所有球員
List<Player> players3 = new ArrayList<>();

// 所有球隊的集合
List<Team> teams = new ArrayList<>();
// 創建每個球隊,傳入的參數是隊名跟隊員
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傳入的數據源是所有球隊的集合
TeamAdapter adapter = new TeamAdapter(this, teams);
  recyclerView.setAdapter(adapter);

到這裏,數據已經可以顯示了,效果就跟上面的圖一樣,但是每個分組後面的箭頭是不會動的,接下來就是給箭頭添加旋轉動畫。實現也是十分簡單,只要在TeamViewHolder中重寫父類的一個方法就行了,當然,裏面的旋轉邏輯是根據實際情況去實現的:

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) {
   // 由展開到收起狀態
   ra = new RotateAnimation(
     ROTATED_POSITION, // 展開狀態角度
     INITIAL_POSITION, // 收起狀態角度
     RotateAnimation.RELATIVE_TO_SELF, // 相對於自己的中心點
     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);
 }

我這裏實現的就是上圖的效果,其實就是旋轉動畫的實現。需要講解一下的是,setExpanded()這個方法在內部已經幫我們調用了,傳進去的參數爲true時,說明該分組是打開的,false則表示該分組沒打開,只要根據這個值做相關的處理,就可以得到想要的效果。

總結

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持神馬文庫。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章