Skip to content

Commit 59e2be8

Browse files
feat(adapter): 优化列表适配器功能
- 为 MultipleChoiceAdapter 和 SingleChoiceAdapter 添加 loadMore 方法,实现加载更多功能 - 为 NormalRecyclerAdapter 添加 refresh 方法,使用 DiffUtil 提高列表更新效率 - 优化 NormalRecyclerAdapter 的 loadMore 方法,确保正确通知列表更新
1 parent e66380b commit 59e2be8

File tree

3 files changed

+67
-9
lines changed

3 files changed

+67
-9
lines changed

lite/src/main/java/com/pengxh/androidx/lite/adapter/MultipleChoiceAdapter.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,9 @@ public void onClick(View v) {
8484
});
8585
}
8686

87+
/**
88+
* 加载更多
89+
*/
8790
public void loadMore(List<T> newRows) {
8891
int startPosition = dataRows.size();
8992
this.dataRows.addAll(newRows);

lite/src/main/java/com/pengxh/androidx/lite/adapter/NormalRecyclerAdapter.java

Lines changed: 63 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import androidx.annotation.LayoutRes;
99
import androidx.annotation.NonNull;
10+
import androidx.recyclerview.widget.DiffUtil;
1011
import androidx.recyclerview.widget.RecyclerView;
1112

1213
import java.util.List;
@@ -51,16 +52,70 @@ public void onClick(View v) {
5152
});
5253
}
5354

54-
@SuppressLint("NotifyDataSetChanged")
55-
public void setRefreshData(List<T> dataRows) {
56-
this.dataRows.clear();
57-
this.dataRows.addAll(dataRows);
58-
notifyDataSetChanged();
55+
public void refresh(List<T> newRows) {
56+
DiffUtil.Callback diffCallback = new DiffUtil.Callback() {
57+
58+
@Override
59+
public int getOldListSize() {
60+
return dataRows.size();
61+
}
62+
63+
@Override
64+
public int getNewListSize() {
65+
return newRows.size();
66+
}
67+
68+
@Override
69+
public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
70+
if (dataRows == null || newRows == null) {
71+
return false;
72+
}
73+
74+
// 检查索引是否在有效范围内
75+
if (oldItemPosition < 0 || oldItemPosition >= dataRows.size() ||
76+
newItemPosition < 0 || newItemPosition >= newRows.size()) {
77+
return false;
78+
}
79+
80+
// 获取元素并进行比较
81+
Object oldItem = dataRows.get(oldItemPosition);
82+
Object newItem = newRows.get(newItemPosition);
83+
84+
// 处理空指针情况
85+
if (oldItem == null && newItem == null) {
86+
return true;
87+
}
88+
if (oldItem == null || newItem == null) {
89+
return false;
90+
}
91+
92+
return oldItem.equals(newItem);
93+
}
94+
95+
@Override
96+
public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
97+
return dataRows.get(oldItemPosition) == newRows.get(newItemPosition);
98+
}
99+
};
100+
101+
DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(diffCallback);
102+
103+
dataRows.clear();
104+
dataRows.addAll(newRows);
105+
106+
diffResult.dispatchUpdatesTo(this);
59107
}
60108

61-
public void setLoadMoreData(List<T> dataRows) {
62-
this.dataRows.addAll(dataRows);
63-
notifyItemRangeInserted(this.dataRows.size(), dataRows.size());
109+
/**
110+
* 加载更多
111+
*/
112+
public void loadMore(List<T> newRows) {
113+
if (newRows.isEmpty()) {
114+
return;
115+
}
116+
int startPosition = this.dataRows.size();
117+
this.dataRows.addAll(newRows);
118+
notifyItemRangeInserted(startPosition, newRows.size());
64119
}
65120

66121
public abstract void convertView(ViewHolder viewHolder, int position, T item);

lite/src/main/java/com/pengxh/androidx/lite/adapter/SingleChoiceAdapter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ public void onClick(View v) {
7474
}
7575

7676
/**
77-
* 加载更多,局部加载
77+
* 加载更多
7878
*/
7979
public void loadMore(List<T> newRows) {
8080
int startPosition = dataRows.size();

0 commit comments

Comments
 (0)