1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232
| public class WrapRecyclerView extends RecyclerView { /** * 包裹了一层的头部底部Adapter */ private WrapRecyclerAdapter mWrapRecyclerAdapter; /** * 这个是列表数据的Adapter */ private RecyclerView.Adapter mAdapter;
/** * 增加一些通用功能 * 空列表数据应该显示的空View * 正在加载数据页面,也就是正在获取后台接口页面 */ private View mEmptyView, mLoadingView;
public WrapRecyclerView(Context context) { super(context); }
public WrapRecyclerView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); }
public WrapRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); }
@Override public void setAdapter(Adapter adapter) { // 为了防止多次设置Adapter if (mAdapter != null) { mAdapter.unregisterAdapterDataObserver(mDataObserver); mAdapter = null; }
this.mAdapter = adapter;
if (adapter instanceof WrapRecyclerAdapter) { mWrapRecyclerAdapter = (WrapRecyclerAdapter) adapter; } else { mWrapRecyclerAdapter = new WrapRecyclerAdapter(adapter); }
super.setAdapter(mWrapRecyclerAdapter);
// 注册一个观察者 mAdapter.registerAdapterDataObserver(mDataObserver);
// 解决GridLayout添加头部和底部也要占据一行 mWrapRecyclerAdapter.adjustSpanSize(this);
// 加载数据页面 if (mLoadingView != null && mLoadingView.getVisibility() == View.VISIBLE) { mLoadingView.setVisibility(View.GONE); }
if (mItemClickListener != null) { mWrapRecyclerAdapter.setOnItemClickListener(mItemClickListener); }
if (mLongClickListener != null) { mWrapRecyclerAdapter.setOnLongClickListener(mLongClickListener); } }
/** * 添加头部 */ public void addHeaderView(View view) { // 如果没有Adapter那么就不添加,也可以选择抛异常提示 // 让他必须先设置Adapter然后才能添加,这里是仿照ListView的处理方式 if (mWrapRecyclerAdapter != null) { mWrapRecyclerAdapter.addHeaderView(view); } }
/** * 添加底部 */ public void addFooterView(View view) { if (mWrapRecyclerAdapter != null) { mWrapRecyclerAdapter.addFooterView(view); } }
/** * 移除头部 */ public void removeHeaderView(View view) { if (mWrapRecyclerAdapter != null) { mWrapRecyclerAdapter.removeHeaderView(view); } }
/** * 移除底部 */ public void removeFooterView(View view) { if (mWrapRecyclerAdapter != null) { mWrapRecyclerAdapter.removeFooterView(view); } }
private final AdapterDataObserver mDataObserver = new AdapterDataObserver() { @Override public void onChanged() { if (mAdapter == null) { return; } // 观察者 列表Adapter更新 包裹的也需要更新不然列表的notifyDataSetChanged没效果 if (mWrapRecyclerAdapter != mAdapter) { mWrapRecyclerAdapter.notifyDataSetChanged(); }
dataChanged(); }
@Override public void onItemRangeRemoved(int positionStart, int itemCount) { if (mAdapter == null) { return; } // 观察者 列表Adapter更新 包裹的也需要更新不然列表的notifyDataSetChanged没效果 if (mWrapRecyclerAdapter != mAdapter) { mWrapRecyclerAdapter.notifyItemRemoved(positionStart); } dataChanged(); }
@Override public void onItemRangeMoved(int fromPosition, int toPosition, int itemCount) { if (mAdapter == null) { return; } // 观察者 列表Adapter更新 包裹的也需要更新不然列表的notifyItemMoved没效果 if (mWrapRecyclerAdapter != mAdapter) { mWrapRecyclerAdapter.notifyItemMoved(fromPosition, toPosition); } dataChanged(); }
@Override public void onItemRangeChanged(int positionStart, int itemCount) { if (mAdapter == null) { return; } // 观察者 列表Adapter更新 包裹的也需要更新不然列表的notifyItemChanged没效果 if (mWrapRecyclerAdapter != mAdapter) { mWrapRecyclerAdapter.notifyItemChanged(positionStart); } dataChanged(); }
@Override public void onItemRangeChanged(int positionStart, int itemCount, Object payload) { if (mAdapter == null) { return; } // 观察者 列表Adapter更新 包裹的也需要更新不然列表的notifyItemChanged没效果 if (mWrapRecyclerAdapter != mAdapter) { mWrapRecyclerAdapter.notifyItemChanged(positionStart, payload); } dataChanged(); }
@Override public void onItemRangeInserted(int positionStart, int itemCount) { if (mAdapter == null) { return; } // 观察者 列表Adapter更新 包裹的也需要更新不然列表的notifyItemInserted没效果 if (mWrapRecyclerAdapter != mAdapter) { mWrapRecyclerAdapter.notifyItemInserted(positionStart); } dataChanged(); } };
/** * 添加一个空列表数据页面 */ public void addEmptyView(View emptyView) { this.mEmptyView = emptyView; }
/** * 添加一个正在加载数据的页面 */ public void addLoadingView(View loadingView) { this.mLoadingView = loadingView; mLoadingView.setVisibility(View.VISIBLE); }
/** * Adapter数据改变的方法 */ private void dataChanged() { if (mAdapter.getItemCount() == 0) { // 没有数据 if (mEmptyView != null) { mEmptyView.setVisibility(VISIBLE); } else { mEmptyView.setVisibility(GONE); } } }
/*************** * 给条目设置点击和长按事件 *********************/ public OnItemClickListener mItemClickListener; public OnItemLongClickListener mLongClickListener;
public void setOnItemClickListener(OnItemClickListener itemClickListener) { this.mItemClickListener = itemClickListener;
if (mWrapRecyclerAdapter != null) { mWrapRecyclerAdapter.setOnItemClickListener(mItemClickListener); } }
public void setOnItemLongClickListener(OnItemLongClickListener longClickListener) { this.mLongClickListener = longClickListener;
if (mWrapRecyclerAdapter != null) { mWrapRecyclerAdapter.setOnLongClickListener(mLongClickListener); } } }
|