Skip to content

Commit 29ebed6

Browse files
committed
release v1.0.3
1 parent 0bf2c76 commit 29ebed6

5 files changed

Lines changed: 82 additions & 49 deletions

File tree

README.md

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
- 每页行数、列数可配置
1212
- 滚动状态自动恢复
13+
- 支持数据重新排序,类似viewpager的分页模式
1314
- item布局样式自定义
1415
- scrollbar样式可配置
1516

@@ -54,6 +55,7 @@ dependencies {
5455
android:background="#ffffff"
5556
app:tl_spanCount="5"
5657
app:tl_lines="2"
58+
app:tl_pagingMode="true"
5759
app:tl_scrollbarWidth="72dp"
5860
app:tl_scrollbarHeight="4dp"
5961
app:tl_scrollbarRadius="2dp"
@@ -80,7 +82,7 @@ public class NavAdapterViewHolder extends Holder<Nav> {
8082
}
8183

8284
@Override
83-
public void bindData(Context context, Nav data) {
85+
public void onBind(Context context, List<T> list, @Nullable Nav data, int position) {
8486
text.setText(data.getText());
8587
Glide.with(context)
8688
.asBitmap()
@@ -93,7 +95,7 @@ public class NavAdapterViewHolder extends Holder<Nav> {
9395
}
9496
```
9597

96-
**Step 3:** java代码中使用
98+
**Step 3:** java代码中调用
9799

98100
```java
99101
List<Nav> navList = DataFactory.loadData();
@@ -102,6 +104,7 @@ TransformersLayout<Nav> header = findViewById();
102104
TransformersOptions options = new TransformersOptions.Builder()
103105
.lines(2)
104106
.spanCount(5)
107+
.pagingMode(true)
105108
.scrollBarWidth(Util.dp2px(this, 40))
106109
.scrollBarHeight(Util.dp2px(this, 3))
107110
.scrollBarRadius(Util.dp2px(this, 3) / 2f)
@@ -123,7 +126,7 @@ header.apply(options)//options可为null
123126
}
124127
@Override
125128
public int getLayoutId() {
126-
return R.layout.item_nav_list;
129+
return R.layout.item_nav_list;//第二步使用的布局
127130
}
128131
});
129132
```
@@ -136,7 +139,8 @@ header.apply(options)//options可为null
136139
| -------- | ---- | ---- |
137140
| tl_spanCount | integer | 每页列数,默认5 |
138141
| tl_lines | integer | 每页行数,默认2 |
139-
| tl_scrollbarWidth | dimension \| reference | scrollbar宽度,默认36dp |
142+
| tl_pagingMode | boolean | 分页模式,数据会重新排序,默认false |
143+
| tl_scrollbarWidth | dimension \| reference | scrollbar宽度,默认48dp |
140144
| tl_scrollbarHeight | dimension \| reference | scrollbar高度,默认3dp |
141145
| tl_scrollbarMarginTop | dimension \| reference | scrollbar上间距 |
142146
| tl_scrollbarRadius | dimension \| reference | scrollbar圆角,默认高度的一半 |
@@ -145,6 +149,12 @@ header.apply(options)//options可为null
145149

146150
# Change log
147151

152+
2020-1-21
153+
154+
- 新方法修复滚动条变长变短问题(很完美)
155+
- 支持数据重新排序
156+
- 回调方法变动
157+
148158
2020-1-5
149159

150160
- 修复滚动条突然变长变短的问题

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ public int getLayoutId() {
6969
RecyclerView rv = findViewById(R.id.rv_main);
7070
rv.setLayoutManager(new LinearLayoutManager(this));
7171
List<String> beans = new ArrayList<>();
72-
for (int i = 0; i < 100; i++) {
72+
for (int i = 0; i < 50; i++) {
7373
beans.add("");
7474
}
7575
final ListAdapter adapter = new ListAdapter(beans);
@@ -83,7 +83,9 @@ public void onRefresh() {
8383
new Handler().postDelayed(new Runnable() {
8484
@Override
8585
public void run() {
86-
navList.remove(0);
86+
if (navList.size() > 0) {
87+
navList.remove(0);
88+
}
8789
header.notifyDataChanged(navList);
8890
refreshLayout.setRefreshing(false);
8991
}

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

Lines changed: 60 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public class TransformersLayout<T> extends LinearLayout {
3939
/** 默认每页2行 */
4040
private static final int DEFAULT_LINES = 2;
4141
/** 滚动条默认宽度 */
42-
private static final int DEFAULT_SCROLL_BAR_WIDTH = 36;//dp
42+
private static final int DEFAULT_SCROLL_BAR_WIDTH = 48;//dp
4343
/** 滚动条默认高度 */
4444
private static final int DEFAULT_SCROLL_BAR_HEIGHT = 3;//dp
4545
private static final int DEFAULT_TRACK_COLOR = Color.parseColor("#f0f0f0");
@@ -64,6 +64,7 @@ public class TransformersLayout<T> extends LinearLayout {
6464
private TransformersAdapter<T> transformersAdapter;
6565
private GridLayoutManager layoutManager;
6666
private Parcelable savedState;//保存的滚动状态
67+
private TransformersOptions transformersOptions;
6768

6869
public TransformersLayout(Context context) {
6970
this(context, null);
@@ -90,6 +91,7 @@ private void parseAttrs(Context context, AttributeSet attrs) {
9091
TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.TransformersLayout);
9192
spanCount = array.getInteger(R.styleable.TransformersLayout_tl_spanCount, DEFAULT_SPAN_COUNT);
9293
lines = array.getInteger(R.styleable.TransformersLayout_tl_lines, DEFAULT_LINES);
94+
pagingMode = array.getBoolean(R.styleable.TransformersLayout_tl_pagingMode, false);
9395
scrollBarRadius = array.getDimensionPixelSize(R.styleable.TransformersLayout_tl_scrollbarRadius, -1);
9496
scrollBarTrackColor = array.getColor(R.styleable.TransformersLayout_tl_scrollbarTrackColor, DEFAULT_TRACK_COLOR);
9597
scrollBarThumbColor = array.getColor(R.styleable.TransformersLayout_tl_scrollbarThumbColor, DEFAULT_THUMB_COLOR);
@@ -157,11 +159,7 @@ public TransformersLayout<T> addOnTransformersItemClickListener(OnTransformersIt
157159
}
158160

159161
public void load(@NonNull List<T> data, TransformersHolderCreator<T> creator){
160-
if (pagingMode){
161-
rearrange(data);
162-
}else {
163-
fillData(data);
164-
}
162+
fixData(data);
165163
transformersAdapter.setOnTransformersItemClickListener(onTransformersItemClickListener);
166164
transformersAdapter.setHolderCreator(creator);
167165
transformersAdapter.setSpanCount(spanCount);
@@ -182,9 +180,41 @@ public void load(@NonNull List<T> data, TransformersHolderCreator<T> creator){
182180
* 1 2 3 4 5 11 12 13 14 15
183181
* 6 7 8 9 10 16 null...
184182
*/
185-
private void rearrange(List<T> data) {
186-
if (data == null || data.isEmpty()) return;
187-
List<List<T>> splitList = new ArrayList<>();
183+
private List<T> rearrange(List<T> data) {
184+
if (lines <= 1) return data;
185+
if (data == null || data.isEmpty()) return data;
186+
List<T> destList = new ArrayList<>();
187+
int pageSize = lines * spanCount;
188+
int size = data.size();
189+
//转换后的总数量,包括空数据
190+
int sizeAfterTransform;
191+
if (size < pageSize) {
192+
// sizeAfterTransform = pageSize;
193+
sizeAfterTransform = size < spanCount ? size * lines : pageSize;
194+
} else if (size % pageSize == 0) {
195+
sizeAfterTransform = size;
196+
} else {
197+
// sizeAfterTransform = (size / pageSize + 1) * pageSize;
198+
sizeAfterTransform = size % pageSize < spanCount
199+
? (size / pageSize) * pageSize + size % pageSize * lines
200+
: (size / pageSize + 1) * pageSize;
201+
}
202+
//类似置换矩阵
203+
for (int i = 0; i < sizeAfterTransform; i++) {
204+
int pageIndex = i / pageSize;
205+
int columnIndex = (i - pageSize * pageIndex) / lines;
206+
int rowIndex = (i - pageSize * pageIndex) % lines;
207+
int destIndex = (rowIndex * spanCount + columnIndex) + pageIndex * pageSize;
208+
209+
if (destIndex >= 0 && destIndex < size) {
210+
destList.add(data.get(destIndex));
211+
} else {
212+
destList.add(null);
213+
}
214+
}
215+
216+
//自己瞎捣鼓的方法...和上面的一比惨不忍睹
217+
/*List<List<T>> splitList = new ArrayList<>();
188218
int size = data.size();
189219
int toIndex = spanCount;
190220
for (int i = 0; i < size; i += spanCount) {
@@ -204,28 +234,28 @@ private void rearrange(List<T> data) {
204234
rowList.add(row);
205235
}
206236
207-
List<T> result = new ArrayList<>();
237+
List<T> destList = new ArrayList<>();
208238
for (int i = 0; i < rowList.get(0).size(); i++) {
209-
result.add(rowList.get(0).get(i));
239+
destList.add(rowList.get(0).get(i));
210240
for (int j = 0; j < rowList.size() - 1; j++) {
211241
if (i > rowList.get(j+1).size() - 1){
212-
result.add(null);
242+
destList.add(null);
213243
}else {
214-
result.add(rowList.get(j+1).get(i));
244+
destList.add(rowList.get(j+1).get(i));
215245
}
216246
}
217-
}
247+
}*/
218248

219-
mDataList = result;
249+
return destList;
220250
}
221251

222252
/**
223253
* 默认排序时如果数据大于一页,使用空数据填满最后一列,用于修复滚动条滑动时变长变短的问题
224254
* @param data
225255
*/
226256
private void fillData(@NonNull List<T> data) {
257+
if (lines <= 1 || data.isEmpty()) return;
227258
mDataList = data;
228-
if (mDataList.isEmpty()) return;
229259
if (mDataList.size() > lines * spanCount && mDataList.size() % lines > 0){
230260
int left = lines - mDataList.size() % lines;
231261
for (int i = 0; i < left; i++) {
@@ -242,8 +272,13 @@ public List<T> getDataList(){
242272
return mDataList;
243273
}
244274

275+
public TransformersOptions getOptions(){
276+
return transformersOptions;
277+
}
278+
245279
public TransformersLayout<T> apply(@Nullable TransformersOptions options){
246280
if (options != null){
281+
transformersOptions = options;
247282
spanCount = options.spanCount <= 0 ? spanCount : options.spanCount;
248283
int newLines = options.lines <= 0 ? lines : options.lines;
249284
scrollBarWidth = options.scrollBarWidth <= 0 ? scrollBarWidth : options.scrollBarWidth;
@@ -289,11 +324,7 @@ protected void onDetachedFromWindow() {
289324

290325
public void notifyDataChanged(List<T> data){
291326
if (transformersAdapter != null){
292-
if (pagingMode){
293-
rearrange(data);
294-
}else {
295-
fillData(data);
296-
}
327+
fixData(data);
297328
transformersAdapter.setData(mDataList);
298329
scrollToStart();
299330
}
@@ -304,6 +335,14 @@ public void notifyDataChanged(List<T> data){
304335
}
305336
}
306337

338+
private void fixData(List<T> data) {
339+
if (pagingMode) {
340+
mDataList = rearrange(data);
341+
} else {
342+
fillData(data);
343+
}
344+
}
345+
307346
public void scrollToStart(){
308347
scrollToStart(true);
309348
}

transformerslayout/src/main/java/com/zaaach/transformerslayout/view/RecyclerViewScrollBar.java

Lines changed: 2 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -162,8 +162,8 @@ public void computeScrollScale() {
162162

163163
//RecyclerView已经滚动的距离
164164
float mScrollOffset = mRecyclerView.computeHorizontalScrollOffset();
165-
//scrollOffset有时会超出可滚动距离
166-
mScrollOffset = mScrollOffset >= canScrollDistance ? canScrollDistance : mScrollOffset;
165+
// //scrollOffset有时会超出可滚动距离
166+
// mScrollOffset = mScrollOffset >= canScrollDistance ? canScrollDistance : mScrollOffset;
167167
if (mScrollRange != 0){
168168
mScrollScale = mScrollOffset / mScrollRange;
169169
}
@@ -184,26 +184,6 @@ public void computeScrollScale() {
184184
postInvalidate();
185185
}
186186

187-
// private float getScrollRange(){
188-
// float range = 0;
189-
// if (mRecyclerView != null){
190-
// int count = 0;
191-
// int lines = 1;
192-
// int itemWidth = 0;
193-
// RecyclerView.Adapter adapter = mRecyclerView.getAdapter();
194-
// if (adapter instanceof TransformersAdapter){
195-
// count = adapter.getItemCount();
196-
// itemWidth = ((TransformersAdapter) adapter).getItemWidth();
197-
// }
198-
// RecyclerView.LayoutManager manager = mRecyclerView.getLayoutManager();
199-
// if (manager instanceof GridLayoutManager){
200-
// lines = ((GridLayoutManager) manager).getSpanCount();
201-
// }
202-
// range = (int)Math.ceil(1.0*count / lines) * itemWidth;
203-
// }
204-
// return range;
205-
// }
206-
207187
@Override
208188
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
209189
super.onMeasure(widthMeasureSpec, heightMeasureSpec);

transformerslayout/src/main/res/values/attrs.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
<attr name="tl_spanCount" format="integer"/>
66
<!--每页几行-->
77
<attr name="tl_lines" format="integer"/>
8+
<!--分页模式-->
9+
<attr name="tl_pagingMode" format="boolean"/>
810
<!--滚动条宽度-->
911
<attr name="tl_scrollbarWidth" format="dimension|reference"/>
1012
<!--滚动条高度-->

0 commit comments

Comments
 (0)