entry : infos.entrySet()) {
+ String key = entry.getKey();
+ String value = entry.getValue();
+ sb.append(String.format("%s=%s\n", key, value));
+ }
+
+ Writer writer = new StringWriter();
+ PrintWriter printWriter = new PrintWriter(writer);
+ ex.printStackTrace(printWriter);
+ Throwable cause = ex.getCause();
+ while (cause != null) {
+ cause.printStackTrace(printWriter);
+ cause = cause.getCause();
+ }
+ printWriter.close();
+
+ String result = writer.toString();
+ sb.append(result);
+
+ long timestamp = System.currentTimeMillis();
+ String time = formatter.format(new Date());
+ String fileName = "crash-" + time + "-" + timestamp + ".log";
+
+ if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
+ String path = String.format("%scrash/", FileHelper.getRootFilePath());
+ File dir = new File(path);
+ if (!dir.exists()) {
+ dir.mkdirs();
+ }
+ FileOutputStream fos = null;
+ try {
+ fos = new FileOutputStream(path + fileName);
+ fos.write(sb.toString().getBytes());
+ } catch (Exception e) {
+ Log.e(TAG, "an error occured while writing file...", e);
+ } finally {
+ try {
+ if (fos != null) {
+ fos.close();
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ return fileName;
+
+
+ }
+}
diff --git a/base/src/main/java/com/xuqm/base/adapter/BaseItem.java b/base/src/main/java/com/xuqm/base/adapter/BaseItem.java
new file mode 100644
index 0000000..c21f8f8
--- /dev/null
+++ b/base/src/main/java/com/xuqm/base/adapter/BaseItem.java
@@ -0,0 +1,17 @@
+package com.xuqm.base.adapter;
+
+/**
+ * 所有用到{@link com.xuqm.base.ui.BaseListActivity}来做的列表页
+ * 数据model都要继承BaseItem
+ */
+public class BaseItem {
+ private int s_id;
+
+ public int getS_id() {
+ return s_id;
+ }
+
+ public void setS_id(int s_id) {
+ this.s_id = s_id;
+ }
+}
diff --git a/base/src/main/java/com/xuqm/base/adapter/BaseNormalAdapter.java b/base/src/main/java/com/xuqm/base/adapter/BaseNormalAdapter.java
new file mode 100644
index 0000000..09b1110
--- /dev/null
+++ b/base/src/main/java/com/xuqm/base/adapter/BaseNormalAdapter.java
@@ -0,0 +1,186 @@
+package com.xuqm.base.adapter;
+
+import android.content.Context;
+import android.view.ViewGroup;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.xuqm.base.adapter.callback.AdapterItemClickListener;
+import com.xuqm.base.adapter.callback.AdapterItemLongClickListener;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 不用{@link BasePagedAdapter}的时候,可以用这个
+ *
+ *
+ * @param 数据各式
+ */
+public abstract class BaseNormalAdapter extends RecyclerView.Adapter {
+ private Context context;
+ private AdapterItemClickListener itemClickListener;//item的点击事件
+ private AdapterItemLongClickListener itemLongClickListener;//item的长按事件
+ private ItemViewDelegateManager mItemViewDelegateManager;//ItemViewDelegate的管理类
+
+ private List list;
+
+ private AdapterItemClickListener listener;
+
+ public BaseNormalAdapter() {
+ this.list = new ArrayList<>();
+ mItemViewDelegateManager = new ItemViewDelegateManager<>();
+ }
+
+ public BaseNormalAdapter(List list) {
+ this.list = null == list ? new ArrayList<>() : list;
+ mItemViewDelegateManager = new ItemViewDelegateManager<>();
+ }
+
+ public void setmDatas(List mDatas) {
+ this.list.clear();
+ this.addmDatas(null == mDatas ? new ArrayList<>() : mDatas);
+ }
+
+ public List getDatas() {
+ return this.list;
+ }
+
+ public void addmDatas(List mDatas) {
+ this.list.addAll(mDatas);
+ notifyDataSetChanged();
+ }
+
+ public void addItem(T item) {
+ this.list.add(item);
+ notifyDataSetChanged();
+ }
+
+ public void removeItem(T item) {
+ this.list.remove(item);
+ notifyDataSetChanged();
+ }
+
+
+ @Override
+ public int getItemViewType(int position) {
+ if (!useItemViewDelegateManager()) return super.getItemViewType(position);
+ return mItemViewDelegateManager.getItemViewType(list.get(position), position);
+ }
+
+
+ /**
+ * 判断是否有多种ItemViewType
+ * 根据mItemViewDelegateManager 里面存储的数量决定
+ *
+ * @return true 有多种ItemViewType
+ */
+ private boolean useItemViewDelegateManager() {
+ return mItemViewDelegateManager.getItemViewDelegateCount() > 0;
+ }
+
+ /**
+ * 添加不同的item样式
+ *
+ * @param itemViewDelegate 自定义的item
+ * @return this
+ */
+ public BaseNormalAdapter addItemViewDelegate(ItemViewDelegate itemViewDelegate) {
+ mItemViewDelegateManager.addDelegate(itemViewDelegate);
+ return this;
+ }
+
+ /**
+ * 添加不同的item样式
+ *
+ * @param viewType 自定义的item type 不能重复
+ * @param itemViewDelegate 自定义的item
+ * @return this
+ */
+ public BaseNormalAdapter addItemViewDelegate(int viewType, ItemViewDelegate itemViewDelegate) {
+ mItemViewDelegateManager.addDelegate(viewType, itemViewDelegate);
+ return this;
+ }
+
+ @NonNull
+ @Override
+ public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+ ItemViewDelegate itemViewDelegate = mItemViewDelegateManager.getItemViewDelegate(viewType);
+ int layoutId = itemViewDelegate.getItemViewLayoutId();//这里拿到自定义的layoutId
+ context = parent.getContext();//context没用传递过来,这里自己获取到
+ return new ViewHolder(context, parent, layoutId);
+ }
+
+ @Override
+ public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
+ if (null != itemClickListener) {
+ holder.itemView.setOnClickListener(v -> itemClickListener.onClick(holder.itemView, list.get(position), position));
+ }
+ if (null != itemLongClickListener) {
+ holder.itemView.setOnLongClickListener(v -> itemLongClickListener.onClick(holder.itemView, list.get(position), position));
+ }
+ convert(holder, list.get(position));
+ }
+
+ @Override
+ public int getItemCount() {
+ return list.size();
+ }
+
+ /**
+ * 设置item点击监听
+ *
+ * @param itemClickListener item的点击事件
+ */
+ public void setItemClickListener(AdapterItemClickListener itemClickListener) {
+ this.itemClickListener = itemClickListener;
+ }
+
+ /**
+ * 设置item长按监听
+ *
+ * @param itemLongClickListener item的长按事件
+ */
+ public void setItemLongClickListener(AdapterItemLongClickListener itemLongClickListener) {
+ this.itemLongClickListener = itemLongClickListener;
+ }
+
+ /**
+ * 部分情况可以需要用到这个,比如item里面元素想要和item使用同一个回调处理
+ *
+ * @return
+ */
+ protected AdapterItemClickListener getItemClickListener() {
+ return itemClickListener;
+ }
+
+ /**
+ * ui绘制的事件,分发给ItemViewDelegate自己处理
+ * 比如settext() setOnClickListener()这些
+ *
+ * @param holder holder
+ * @param item item
+ */
+ public void convert(ViewHolder holder, T item) {
+ mItemViewDelegateManager.convert(holder, item, holder.getAdapterPosition());
+ }
+
+ /**
+ * 刷新知道item
+ *
+ * @param position position
+ */
+ public void changeItem(int position) {
+ if (0 <= position && position < getItemCount()) {
+ notifyItemChanged(position);
+ }
+ }
+
+ public void changeItem(int position, Object payload) {
+ if (0 <= position && position < getItemCount()) {
+ notifyItemChanged(position, payload);
+ }
+ }
+
+}
diff --git a/base/src/main/java/com/xuqm/base/adapter/BasePagedAdapter.java b/base/src/main/java/com/xuqm/base/adapter/BasePagedAdapter.java
new file mode 100644
index 0000000..c9743a1
--- /dev/null
+++ b/base/src/main/java/com/xuqm/base/adapter/BasePagedAdapter.java
@@ -0,0 +1,157 @@
+package com.xuqm.base.adapter;
+
+import android.content.Context;
+import android.view.ViewGroup;
+
+import androidx.annotation.NonNull;
+import androidx.paging.PagedListAdapter;
+
+import com.xuqm.base.adapter.callback.AdapterItemClickListener;
+import com.xuqm.base.adapter.callback.AdapterItemLongClickListener;
+
+import java.util.List;
+
+/**
+ * 如果用到了{@link com.xuqm.base.ui.BaseListActivity}来展示列表页面的话,需要adapter继承这个
+ *
+ * 如果item只有一种类型,可以使用{@link CommonPagedAdapter}来展示
+ *
+ * 如果不用{@link CommonPagedAdapter}的话,继承后需要使用{@link #addItemViewDelegate(ItemViewDelegate)}
+ * 来设置展示的页面
+ *
+ * @param
+ */
+public class BasePagedAdapter extends PagedListAdapter {
+ private Context context;
+ private AdapterItemClickListener itemClickListener;//item的点击事件
+ private AdapterItemLongClickListener itemLongClickListener;//item的长按事件
+ private ItemViewDelegateManager mItemViewDelegateManager;//ItemViewDelegate的管理类
+
+ public BasePagedAdapter() {
+ super(new Diff<>());
+ mItemViewDelegateManager = new ItemViewDelegateManager<>();
+ }
+
+
+ @Override
+ public int getItemViewType(int position) {
+ if (!useItemViewDelegateManager()) return super.getItemViewType(position);
+ return mItemViewDelegateManager.getItemViewType(getItem(position), position);
+ }
+
+
+ /**
+ * 判断是否有多种ItemViewType
+ * 根据mItemViewDelegateManager 里面存储的数量决定
+ *
+ * @return true 有多种ItemViewType
+ */
+ private boolean useItemViewDelegateManager() {
+ return mItemViewDelegateManager.getItemViewDelegateCount() > 0;
+ }
+
+ /**
+ * 添加不同的item样式
+ *
+ * @param itemViewDelegate 自定义的item
+ * @return this
+ */
+ public BasePagedAdapter addItemViewDelegate(ItemViewDelegate itemViewDelegate) {
+ mItemViewDelegateManager.addDelegate(itemViewDelegate);
+ return this;
+ }
+
+ /**
+ * 添加不同的item样式
+ *
+ * @param viewType 自定义的item type 不能重复
+ * @param itemViewDelegate 自定义的item
+ * @return this
+ */
+ public BasePagedAdapter addItemViewDelegate(int viewType, ItemViewDelegate itemViewDelegate) {
+ mItemViewDelegateManager.addDelegate(viewType, itemViewDelegate);
+ return this;
+ }
+
+ @NonNull
+ @Override
+ public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+ ItemViewDelegate itemViewDelegate = mItemViewDelegateManager.getItemViewDelegate(viewType);
+ int layoutId = itemViewDelegate.getItemViewLayoutId();//这里拿到自定义的layoutId
+ context = parent.getContext();//context没用传递过来,这里自己获取到
+ return new ViewHolder(context, parent, layoutId);
+ }
+
+ @Override
+ public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
+ convert(holder, getItem(position));
+ }
+
+ @Override
+ public void onBindViewHolder(@NonNull ViewHolder holder, int position, @NonNull List