Skip to content

Commit 0bf2c76

Browse files
committed
使用新方法修复滚动条变长变短问题,增加分页模式的数据排序配置
1 parent 32d9cd4 commit 0bf2c76

8 files changed

Lines changed: 151 additions & 60 deletions

File tree

app/src/main/java/com/zaaach/transformerslayoutdemo/DataFactory.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public static List<Nav> loadData() {
3232
navs.add(new Nav(R.mipmap.ic_nav_order, "订单", "https://c-ssl.duitang.com/uploads/item/201911/25/20191125172705_zzyP2.png"));
3333
navs.add(new Nav(R.mipmap.ic_nav_service, "客服", "https://c-ssl.duitang.com/uploads/item/201911/25/20191125172705_Wuun5.png"));
3434
navs.add(new Nav(R.mipmap.ic_nav_shopping, "商城", "https://c-ssl.duitang.com/uploads/item/201911/25/20191125172730_VnmYC.png"));
35-
navs.add(new Nav(R.mipmap.ic_nav_stock, "库存", "https://c-ssl.duitang.com/uploads/item/201911/25/20191125172730_iSTcz.png"));
35+
// navs.add(new Nav(R.mipmap.ic_nav_stock, "库存", "https://c-ssl.duitang.com/uploads/item/201911/25/20191125172730_iSTcz.png"));
3636
return navs;
3737
}
3838
}

app/src/main/java/com/zaaach/transformerslayoutdemo/ListActivity.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,10 @@ protected void onCreate(@Nullable Bundle savedInstanceState) {
3939
TransformersOptions options = new TransformersOptions.Builder()
4040
.lines(2)
4141
.spanCount(5)
42-
.scrollBarWidth(Util.dp2px(this, 40))
42+
.pagingMode(true)
43+
.scrollBarWidth(Util.dp2px(this, 48))
4344
.scrollBarHeight(Util.dp2px(this, 4))
44-
.scrollBarRadius(Util.dp2px(this, 4) / 2)
45+
.scrollBarRadius(Util.dp2px(this, 4) / 2f)
4546
.scrollBarTopMargin(Util.dp2px(this, 6))
4647
.scrollBarTrackColor(Color.parseColor("#e5e5e5"))
4748
// .scrollBarThumbColor(Color.parseColor("#658421"))
@@ -50,7 +51,7 @@ protected void onCreate(@Nullable Bundle savedInstanceState) {
5051
.addOnTransformersItemClickListener(new OnTransformersItemClickListener() {
5152
@Override
5253
public void onItemClick(int position) {
53-
Toast.makeText(getApplication(), "点击:" + navList.get(position).getText() + ",位置" + position, Toast.LENGTH_SHORT).show();
54+
Toast.makeText(getApplication(), "点击:" + header.getDataList().get(position).getText() + ",position=" + position, Toast.LENGTH_SHORT).show();
5455
}
5556
})
5657
.load(navList, new TransformersHolderCreator<Nav>() {

app/src/main/java/com/zaaach/transformerslayoutdemo/NavAdapterViewHolder.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,14 @@
66
import android.widget.TextView;
77

88
import androidx.annotation.NonNull;
9+
import androidx.annotation.Nullable;
910

1011
import com.bumptech.glide.Glide;
1112
import com.bumptech.glide.load.engine.DiskCacheStrategy;
1213
import com.zaaach.transformerslayout.holder.Holder;
1314

15+
import java.util.List;
16+
1417
/**
1518
* @Author: Zaaach
1619
* @Date: 2019/11/25
@@ -32,7 +35,8 @@ protected void initView(View itemView) {
3235
}
3336

3437
@Override
35-
public void bindData(Context context, Nav data) {
38+
public void onBind(Context context, List<Nav> list, @Nullable Nav data, int position) {
39+
if (data == null) return;
3640
text.setText(data.getText());
3741
// icon.setImageResource(data.getIcon());
3842
Glide.with(context)

transformerslayout/src/main/java/com/zaaach/transformerslayout/TransformersLayout.java

Lines changed: 95 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import android.view.View;
1111
import android.widget.LinearLayout;
1212

13+
import androidx.annotation.NonNull;
1314
import androidx.annotation.Nullable;
1415
import androidx.annotation.RequiresApi;
1516
import androidx.recyclerview.widget.GridLayoutManager;
@@ -21,6 +22,7 @@
2122
import com.zaaach.transformerslayout.listener.OnTransformersScrollListener;
2223
import com.zaaach.transformerslayout.view.RecyclerViewScrollBar;
2324

25+
import java.util.ArrayList;
2426
import java.util.List;
2527

2628
/**
@@ -51,16 +53,17 @@ public class TransformersLayout<T> extends LinearLayout {
5153
private int scrollBarTopMargin;
5254
private int scrollBarWidth;
5355
private int scrollBarHeight;
56+
private boolean pagingMode;
5457
private OnTransformersItemClickListener onTransformersItemClickListener;
5558

5659
private RecyclerView recyclerView;
5760
private RecyclerViewScrollBar scrollBar;
5861
private OnTransformersScrollListener onScrollListener;
5962

63+
private List<T> mDataList;
6064
private TransformersAdapter<T> transformersAdapter;
6165
private GridLayoutManager layoutManager;
6266
private Parcelable savedState;//保存的滚动状态
63-
// private boolean attached;
6467

6568
public TransformersLayout(Context context) {
6669
this(context, null);
@@ -121,7 +124,13 @@ private void init(final Context context) {
121124
itemAnimator.setChangeDuration(0);
122125
}
123126

124-
setupRecyclerView();
127+
layoutManager = new GridLayoutManager(getContext(), lines, GridLayoutManager.HORIZONTAL, false){
128+
@Override
129+
public boolean canScrollVertically() {
130+
return false;
131+
}
132+
};
133+
recyclerView.setLayoutManager(layoutManager);
125134
transformersAdapter = new TransformersAdapter<>(context, recyclerView);
126135
recyclerView.setAdapter(transformersAdapter);
127136

@@ -132,16 +141,6 @@ private void init(final Context context) {
132141
addView(scrollBar);
133142
}
134143

135-
private void setupRecyclerView() {
136-
layoutManager = new GridLayoutManager(getContext(), lines, GridLayoutManager.HORIZONTAL, false){
137-
@Override
138-
public boolean canScrollVertically() {
139-
return false;
140-
}
141-
};
142-
recyclerView.setLayoutManager(layoutManager);
143-
}
144-
145144
private void setupScrollBar() {
146145
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(scrollBarWidth, scrollBarHeight);
147146
params.topMargin = scrollBarTopMargin;
@@ -157,17 +156,92 @@ public TransformersLayout<T> addOnTransformersItemClickListener(OnTransformersIt
157156
return this;
158157
}
159158

160-
public void load(List<T> data, TransformersHolderCreator<T> creator){
159+
public void load(@NonNull List<T> data, TransformersHolderCreator<T> creator){
160+
if (pagingMode){
161+
rearrange(data);
162+
}else {
163+
fillData(data);
164+
}
161165
transformersAdapter.setOnTransformersItemClickListener(onTransformersItemClickListener);
162166
transformersAdapter.setHolderCreator(creator);
163167
transformersAdapter.setSpanCount(spanCount);
164-
transformersAdapter.setData(data);
168+
transformersAdapter.setData(mDataList);
165169
toggleScrollBar(data);
166170
if (scrollBar.getVisibility() == VISIBLE) {
167171
scrollBar.attachRecyclerView(recyclerView);
168172
}
169173
}
170174

175+
/**
176+
* 重新排列数据,使数据转换成分页模式
177+
* 原始数据:
178+
* 1 3 5 7 9 11 13 15
179+
* 2 4 6 8 10 12 14 16
180+
* ==============================
181+
* 转换之后:(数据会增加null值)
182+
* 1 2 3 4 5 11 12 13 14 15
183+
* 6 7 8 9 10 16 null...
184+
*/
185+
private void rearrange(List<T> data) {
186+
if (data == null || data.isEmpty()) return;
187+
List<List<T>> splitList = new ArrayList<>();
188+
int size = data.size();
189+
int toIndex = spanCount;
190+
for (int i = 0; i < size; i += spanCount) {
191+
if (i + spanCount > size){
192+
toIndex = size - i;
193+
}
194+
List<T> split = data.subList(i, i + toIndex);
195+
splitList.add(split);
196+
}
197+
198+
List<List<T>> rowList = new ArrayList<>();
199+
for (int i = 0; i < lines; i++) {
200+
List<T> row = new ArrayList<>();
201+
for (int j = i; j < splitList.size(); j += lines) {
202+
row.addAll(splitList.get(j));
203+
}
204+
rowList.add(row);
205+
}
206+
207+
List<T> result = new ArrayList<>();
208+
for (int i = 0; i < rowList.get(0).size(); i++) {
209+
result.add(rowList.get(0).get(i));
210+
for (int j = 0; j < rowList.size() - 1; j++) {
211+
if (i > rowList.get(j+1).size() - 1){
212+
result.add(null);
213+
}else {
214+
result.add(rowList.get(j+1).get(i));
215+
}
216+
}
217+
}
218+
219+
mDataList = result;
220+
}
221+
222+
/**
223+
* 默认排序时如果数据大于一页,使用空数据填满最后一列,用于修复滚动条滑动时变长变短的问题
224+
* @param data
225+
*/
226+
private void fillData(@NonNull List<T> data) {
227+
mDataList = data;
228+
if (mDataList.isEmpty()) return;
229+
if (mDataList.size() > lines * spanCount && mDataList.size() % lines > 0){
230+
int left = lines - mDataList.size() % lines;
231+
for (int i = 0; i < left; i++) {
232+
mDataList.add(null);
233+
}
234+
}
235+
}
236+
237+
/**
238+
* 获取列表数据
239+
* @return
240+
*/
241+
public List<T> getDataList(){
242+
return mDataList;
243+
}
244+
171245
public TransformersLayout<T> apply(@Nullable TransformersOptions options){
172246
if (options != null){
173247
spanCount = options.spanCount <= 0 ? spanCount : options.spanCount;
@@ -176,6 +250,7 @@ public TransformersLayout<T> apply(@Nullable TransformersOptions options){
176250
scrollBarHeight = options.scrollBarHeight <= 0 ? scrollBarHeight : options.scrollBarHeight;
177251
scrollBarRadius = options.scrollBarRadius < 0 ? scrollBarHeight/2f : options.scrollBarRadius;
178252
scrollBarTopMargin = options.scrollBarTopMargin <= 0 ? scrollBarTopMargin : options.scrollBarTopMargin;
253+
pagingMode = options.pagingMode;
179254

180255
// Log.e(TAG, "trackColor = " + options.scrollBarTrackColor);
181256
// Log.e(TAG, "thumbColor = " + options.scrollBarThumbColor);
@@ -196,9 +271,7 @@ public TransformersLayout<T> apply(@Nullable TransformersOptions options){
196271
*/
197272
@Override
198273
protected void onAttachedToWindow() {
199-
// Log.e(TAG, "----------onAttachedToWindow()");
200274
super.onAttachedToWindow();
201-
// attached = true;
202275
if (savedState != null) {
203276
layoutManager.onRestoreInstanceState(savedState);
204277
}
@@ -210,15 +283,18 @@ protected void onAttachedToWindow() {
210283
*/
211284
@Override
212285
protected void onDetachedFromWindow() {
213-
// Log.e(TAG, "----------onDetachedFromWindow()");
214286
super.onDetachedFromWindow();
215-
// attached = false;
216287
savedState = layoutManager.onSaveInstanceState();
217288
}
218289

219290
public void notifyDataChanged(List<T> data){
220291
if (transformersAdapter != null){
221-
transformersAdapter.setData(data);
292+
if (pagingMode){
293+
rearrange(data);
294+
}else {
295+
fillData(data);
296+
}
297+
transformersAdapter.setData(mDataList);
222298
scrollToStart();
223299
}
224300
toggleScrollBar(data);
@@ -236,7 +312,6 @@ public void scrollToStart(boolean smooth){
236312
scrollBar.setScrollBySelf(true);
237313
if (recyclerView != null) {
238314
if (recyclerView.computeHorizontalScrollOffset() > 0) {
239-
// Log.e(TAG, "----------scrollToStart()");
240315
if (smooth) {
241316
recyclerView.smoothScrollToPosition(0);
242317
} else {

transformerslayout/src/main/java/com/zaaach/transformerslayout/TransformersOptions.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ public class TransformersOptions {
1818
public final int scrollBarTrackColor;
1919
public final int scrollBarThumbColor;
2020
public final float scrollBarRadius;
21+
public final boolean pagingMode;
2122

2223
private TransformersOptions(Builder builder) {
2324
spanCount = builder.spanCount;
@@ -28,6 +29,7 @@ private TransformersOptions(Builder builder) {
2829
scrollBarTrackColor = builder.scrollBarTrackColor;
2930
scrollBarThumbColor = builder.scrollBarThumbColor;
3031
scrollBarRadius = builder.scrollBarRadius;
32+
pagingMode = builder.pagingMode;
3133
}
3234

3335
public static class Builder{
@@ -39,6 +41,12 @@ public static class Builder{
3941
private int scrollBarTrackColor;
4042
private int scrollBarThumbColor;
4143
private float scrollBarRadius = -1;
44+
private boolean pagingMode;
45+
46+
public Builder pagingMode(boolean paging){
47+
this.pagingMode = paging;
48+
return this;
49+
}
4250

4351
public Builder scrollBarRadius(@Px float radius) {
4452
this.scrollBarRadius = radius;

transformerslayout/src/main/java/com/zaaach/transformerslayout/adapter/TransformersAdapter.java

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ public class TransformersAdapter<T> extends RecyclerView.Adapter<Holder<T>> {
2727
private RecyclerView mRecyclerView;
2828
private int spanCount;
2929
private OnTransformersItemClickListener onTransformersItemClickListener;
30-
private int itemWidth;
3130

3231
public void setOnTransformersItemClickListener(OnTransformersItemClickListener listener) {
3332
this.onTransformersItemClickListener = listener;
@@ -43,10 +42,6 @@ public void setData(List<T> data){
4342
notifyDataSetChanged();
4443
}
4544

46-
public int getItemWidth() {
47-
return itemWidth;
48-
}
49-
5045
public void setSpanCount(int spanCount){
5146
this.spanCount = spanCount;
5247
}
@@ -62,22 +57,31 @@ public Holder<T> onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
6257
View itemView = LayoutInflater.from(parent.getContext()).inflate(layoutId, parent, false);
6358
//每个item平分整个屏幕的宽度
6459
RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) itemView.getLayoutParams();
65-
itemWidth = mRecyclerView.getMeasuredWidth() / spanCount;
66-
params.width = itemWidth;
60+
params.width = mRecyclerView.getMeasuredWidth() / spanCount;
6761
return holderCreator.createHolder(itemView);
6862
}
6963

7064
@Override
7165
public void onBindViewHolder(@NonNull final Holder<T> holder, final int position) {
66+
if (mData.get(position) == null){
67+
holder.itemView.setVisibility(View.INVISIBLE);
68+
}else {
69+
holder.itemView.setVisibility(View.VISIBLE);
70+
}
7271
holder.itemView.setOnClickListener(new View.OnClickListener() {
7372
@Override
7473
public void onClick(View view) {
75-
if (onTransformersItemClickListener != null){
76-
onTransformersItemClickListener.onItemClick(position);
74+
if (mData.get(position) != null) {
75+
if (onTransformersItemClickListener != null) {
76+
onTransformersItemClickListener.onItemClick(position);
77+
}
7778
}
79+
// else {
80+
// Log.e("adapter", "-------点击位置:" + position);
81+
// }
7882
}
7983
});
80-
holder.bindData(mContext, mData.get(position));
84+
holder.onBind(mContext, mData, mData.get(position), position);
8185
}
8286

8387
@Override

transformerslayout/src/main/java/com/zaaach/transformerslayout/holder/Holder.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,11 @@
44
import android.view.View;
55

66
import androidx.annotation.NonNull;
7+
import androidx.annotation.Nullable;
78
import androidx.recyclerview.widget.RecyclerView;
89

10+
import java.util.List;
11+
912
/**
1013
* @Author: Zaaach
1114
* @Date: 2019/11/22
@@ -20,5 +23,5 @@ public Holder(@NonNull View itemView) {
2023

2124
protected abstract void initView(View itemView);
2225

23-
public abstract void bindData(Context context, T data);
26+
public abstract void onBind(Context context, List<T> list, @Nullable T data, int position);
2427
}

0 commit comments

Comments
 (0)