BaseNormalAdapter.java 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. package com.xuqm.base.adapter;
  2. import android.content.Context;
  3. import android.view.ViewGroup;
  4. import androidx.annotation.NonNull;
  5. import androidx.recyclerview.widget.RecyclerView;
  6. import com.xuqm.base.adapter.callback.AdapterItemClickListener;
  7. import com.xuqm.base.adapter.callback.AdapterItemLongClickListener;
  8. import java.util.ArrayList;
  9. import java.util.List;
  10. /**
  11. * 不用{@link BasePagedAdapter}的时候,可以用这个
  12. * <p>
  13. *
  14. * @param <T> 数据各式
  15. */
  16. public abstract class BaseNormalAdapter<T> extends RecyclerView.Adapter<ViewHolder> {
  17. private Context context;
  18. private AdapterItemClickListener<T> itemClickListener;//item的点击事件
  19. private AdapterItemLongClickListener<T> itemLongClickListener;//item的长按事件
  20. private ItemViewDelegateManager<T> mItemViewDelegateManager;//ItemViewDelegate的管理类
  21. private List<T> list;
  22. private AdapterItemClickListener<T> listener;
  23. public BaseNormalAdapter() {
  24. this.list = new ArrayList<>();
  25. mItemViewDelegateManager = new ItemViewDelegateManager<>();
  26. }
  27. public BaseNormalAdapter(List<T> list) {
  28. this.list = null == list ? new ArrayList<>() : list;
  29. mItemViewDelegateManager = new ItemViewDelegateManager<>();
  30. }
  31. public void setmDatas(List<T> mDatas) {
  32. this.list.clear();
  33. this.addmDatas(null == mDatas ? new ArrayList<>() : mDatas);
  34. }
  35. public List<T> getDatas() {
  36. return this.list;
  37. }
  38. public void addmDatas(List<T> mDatas) {
  39. this.list.addAll(mDatas);
  40. notifyDataSetChanged();
  41. }
  42. public void addItem(T item) {
  43. this.list.add(item);
  44. notifyDataSetChanged();
  45. }
  46. public void removeItem(T item) {
  47. this.list.remove(item);
  48. notifyDataSetChanged();
  49. }
  50. @Override
  51. public int getItemViewType(int position) {
  52. if (!useItemViewDelegateManager()) return super.getItemViewType(position);
  53. return mItemViewDelegateManager.getItemViewType(list.get(position), position);
  54. }
  55. /**
  56. * 判断是否有多种ItemViewType
  57. * 根据mItemViewDelegateManager 里面存储的数量决定
  58. *
  59. * @return true 有多种ItemViewType
  60. */
  61. private boolean useItemViewDelegateManager() {
  62. return mItemViewDelegateManager.getItemViewDelegateCount() > 0;
  63. }
  64. /**
  65. * 添加不同的item样式
  66. *
  67. * @param itemViewDelegate 自定义的item
  68. * @return this
  69. */
  70. public BaseNormalAdapter addItemViewDelegate(ItemViewDelegate<T> itemViewDelegate) {
  71. mItemViewDelegateManager.addDelegate(itemViewDelegate);
  72. return this;
  73. }
  74. /**
  75. * 添加不同的item样式
  76. *
  77. * @param viewType 自定义的item type 不能重复
  78. * @param itemViewDelegate 自定义的item
  79. * @return this
  80. */
  81. public BaseNormalAdapter addItemViewDelegate(int viewType, ItemViewDelegate<T> itemViewDelegate) {
  82. mItemViewDelegateManager.addDelegate(viewType, itemViewDelegate);
  83. return this;
  84. }
  85. @NonNull
  86. @Override
  87. public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
  88. ItemViewDelegate itemViewDelegate = mItemViewDelegateManager.getItemViewDelegate(viewType);
  89. int layoutId = itemViewDelegate.getItemViewLayoutId();//这里拿到自定义的layoutId
  90. context = parent.getContext();//context没用传递过来,这里自己获取到
  91. return new ViewHolder(context, parent, layoutId);
  92. }
  93. @Override
  94. public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
  95. if (null != itemClickListener) {
  96. holder.itemView.setOnClickListener(v -> itemClickListener.onClick(holder.itemView, list.get(position), position));
  97. }
  98. if (null != itemLongClickListener) {
  99. holder.itemView.setOnLongClickListener(v -> itemLongClickListener.onClick(holder.itemView, list.get(position), position));
  100. }
  101. convert(holder, list.get(position));
  102. }
  103. @Override
  104. public int getItemCount() {
  105. return list.size();
  106. }
  107. /**
  108. * 设置item点击监听
  109. *
  110. * @param itemClickListener item的点击事件
  111. */
  112. public void setItemClickListener(AdapterItemClickListener<T> itemClickListener) {
  113. this.itemClickListener = itemClickListener;
  114. }
  115. /**
  116. * 设置item长按监听
  117. *
  118. * @param itemLongClickListener item的长按事件
  119. */
  120. public void setItemLongClickListener(AdapterItemLongClickListener<T> itemLongClickListener) {
  121. this.itemLongClickListener = itemLongClickListener;
  122. }
  123. /**
  124. * 部分情况可以需要用到这个,比如item里面元素想要和item使用同一个回调处理
  125. *
  126. * @return
  127. */
  128. protected AdapterItemClickListener<T> getItemClickListener() {
  129. return itemClickListener;
  130. }
  131. /**
  132. * ui绘制的事件,分发给ItemViewDelegate自己处理
  133. * 比如settext() setOnClickListener()这些
  134. *
  135. * @param holder holder
  136. * @param item item
  137. */
  138. public void convert(ViewHolder holder, T item) {
  139. mItemViewDelegateManager.convert(holder, item, holder.getAdapterPosition());
  140. }
  141. /**
  142. * 刷新知道item
  143. *
  144. * @param position position
  145. */
  146. public void changeItem(int position) {
  147. if (0 <= position && position < getItemCount()) {
  148. notifyItemChanged(position);
  149. }
  150. }
  151. public void changeItem(int position, Object payload) {
  152. if (0 <= position && position < getItemCount()) {
  153. notifyItemChanged(position, payload);
  154. }
  155. }
  156. }