Skip to content

Commit 2ca5772

Browse files
author
weimingjue
committed
版本3.1.0,优化判断条目位置的逻辑
1 parent 0ce3925 commit 2ca5772

File tree

7 files changed

+65
-34
lines changed

7 files changed

+65
-34
lines changed

README.md

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,17 @@ public class WaitPayOrderAdapter extends OneContainerItemAdapter<AdapterMsgWaitP
1919
@Override
2020
protected void onBindChildViewHolder(@NonNull BaseViewHolder<AdapterMsgWaitPayOrderBinding> holder, OrderBean bean) {
2121
String text = "列表状态:";
22-
int absState = getCurrentPositionInfo().mAbsState;
23-
if ((absState & ItemAdapterPositionInfo.<ABS_STATE_FIRST_LIST_POSITION) != 0) {
22+
ItemAdapterPositionInfo info = getCurrentPositionInfo();
23+
if (info.isFirst()) {
2424
text += "整个列表第一个";
2525
}
26-
if ((absState & ItemAdapterPositionInfo.<ABS_STATE_LAST_LIST_POSITION) != 0) {
26+
if (info.isLast()) {
2727
text += "整个列表最后一个";
2828
}
29-
if ((absState & ItemAdapterPositionInfo.ABS_STATE_CENTER_POSITION) != 0) {
29+
if (info.isCenter()) {
3030
text += "列表中间";
3131
}
32-
holder.getBinding().tvState.setText(text);
32+
holder.getBinding().btState.setText(text);
3333
}
3434
}
3535
```
@@ -70,6 +70,8 @@ public class TextAdapter extends BaseContainerItemAdapter<BaseViewHolder, TextBe
7070
protected void onBindViewHolder(@NonNull BaseViewHolder holder, int position) {
7171
TextView tv = (TextView) holder.itemView;
7272
tv.setText("这是文字:" + getCurrentBean().textInfo.text);
73+
//ItemAdapterPositionInfo info = getCurrentPositionInfo();
74+
//TextBean currentBean = (TextBean) getContainerAdapter().get(info.mListPosition);//和getCurrentBean()一样的
7375
}
7476
7577
@Override
@@ -108,7 +110,7 @@ adapter.setOnItemClickListener(new OnItemClickListener<TextBean>() {
108110
}
109111
});
110112
```
111-
如果是GridLayoutManage,也有getSpanSize
113+
如果是GridLayoutManager,也有getSpanSize
112114
```
113115
public class TextAdapter extends BaseContainerItemAdapter<BaseViewHolder, TextBean> {
114116
@@ -130,13 +132,12 @@ public class TextAdapter extends BaseContainerItemAdapter<BaseViewHolder, TextBe
130132
protected void onBindViewHolder(@NonNull BaseViewHolder holder, int position) {
131133
ItemAdapterPositionInfo info = getCurrentPositionInfo();//详见ItemAdapterPositionInfo类
132134
int absState = info.mAbsState;
133-
if ((absState & ItemAdapterPositionInfo.<ABS_STATE_FIRST_LIST_POSITION) != 0) {
135+
if (info.isFirst()) {
134136
text += ",整个列表第一个";
135137
}
136-
if ((absState & ItemAdapterPositionInfo.<ABS_STATE_LAST_LIST_POSITION) != 0) {
138+
if (info.isLast()) {
137139
text += ",整个列表最后一个";
138140
}
139-
TextBean currentBean = (TextBean) getContainerAdapter().get(info.mListPosition);//和getCurrentBean一样的效果
140141
}
141142
}
142143
//考虑到性能问题只能在{@link #bindViewHolder}{@link #getItemViewType}{@link #getSpanSize}三个地方使用
@@ -171,7 +172,7 @@ allprojects {
171172
}
172173
```
173174
AndroidX导入:
174-
`implementation(或api) 'com.github.weimingjue:BaseContainerAdapter:3.0.9'`
175+
`implementation(或api) 'com.github.weimingjue:BaseContainerAdapter:3.1.0'`
175176

176177
混淆要求:
177178
```

adapters/src/main/java/com/wang/container/BaseContainerAdapter.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -263,11 +263,6 @@ protected ItemAdapterPositionInfo getItemPositionInfo(int position) {
263263
if (position == mHelper.mList.size() - 1) {
264264
mItemPositionCacheInfo.mAbsState |= ItemAdapterPositionInfo.ABS_STATE_LAST_LIST_POSITION;
265265
}
266-
if ((mItemPositionCacheInfo.mAbsState & ItemAdapterPositionInfo.ABS_STATE_FIRST_LIST_POSITION) == 0 &&
267-
(mItemPositionCacheInfo.mAbsState & ItemAdapterPositionInfo.ABS_STATE_LAST_LIST_POSITION) == 0) {
268-
//不是第一个,也不是最后一个,当然是中间的了
269-
mItemPositionCacheInfo.mAbsState |= ItemAdapterPositionInfo.ABS_STATE_CENTER_POSITION;
270-
}
271266
if (getHeaderView() != null) {
272267
mItemPositionCacheInfo.mAbsState |= ItemAdapterPositionInfo.ABS_STATE_HAS_HEADER;
273268
}

adapters/src/main/java/com/wang/container/bean/ItemAdapterPositionInfo.java

Lines changed: 41 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,9 @@
55
public class ItemAdapterPositionInfo {
66

77
/**
8-
* 当前view在整个recyclerview的位置状态
9-
* 例:是不是最后一个(mAbsState & ABS_STATE_LAST_LIST_POSITION )!= 0
10-
* 有没有header (mAbsState & ABS_STATE_HAS_HEADER )!= 0
11-
* 注意:整个adapter只有一个条目时既是第一个又是最后一个
8+
* 见下方相关方法{@link #isFirst}
129
*/
1310
public static final int ABS_STATE_FIRST_LIST_POSITION = 0x1;//第一个
14-
public static final int ABS_STATE_CENTER_POSITION = ABS_STATE_FIRST_LIST_POSITION << 1;//中间
1511
public static final int ABS_STATE_LAST_LIST_POSITION = ABS_STATE_FIRST_LIST_POSITION << 2;//最后一个
1612
public static final int ABS_STATE_HAS_HEADER = ABS_STATE_FIRST_LIST_POSITION << 3;//有header
1713
public static final int ABS_STATE_HAS_FOOTER = ABS_STATE_FIRST_LIST_POSITION << 4;//有footer
@@ -26,9 +22,48 @@ public class ItemAdapterPositionInfo {
2622
*/
2723
public int mItemPosition;
2824
/**
29-
* 当前position所在的位置信息,见上方静态常量
25+
* 当前position所在的位置信息,见下方相关方法{@link #isFirst}
3026
*/
3127
public int mAbsState;
3228

3329
public IContainerItemAdapter mItemAdapter;
30+
31+
/**
32+
* 是不是列表第一个(除了header)
33+
* <p>
34+
* 注意:整个adapter只有一个条目时既是第一个又是最后一个
35+
*/
36+
public boolean isFirst() {
37+
return (mAbsState & ABS_STATE_FIRST_LIST_POSITION) != 0;
38+
}
39+
40+
/**
41+
* 是不是列表里中间的(不是header、也不是footer)
42+
*/
43+
public boolean isCenter() {
44+
return !(isFirst() || isLast());
45+
}
46+
47+
/**
48+
* 是不是列表最后一个(除了footer)
49+
* <p>
50+
* 注意:整个adapter只有一个条目时既是第一个又是最后一个
51+
*/
52+
public boolean isLast() {
53+
return (mAbsState & ABS_STATE_LAST_LIST_POSITION) != 0;
54+
}
55+
56+
/**
57+
* 列表有没有header
58+
*/
59+
public boolean hasHeader() {
60+
return (mAbsState & ABS_STATE_HAS_HEADER) != 0;
61+
}
62+
63+
/**
64+
* 列表有没有footer
65+
*/
66+
public boolean hasFooter() {
67+
return (mAbsState & ABS_STATE_HAS_FOOTER) != 0;
68+
}
3469
}

app/src/main/java/com/wang/example/msg/adapter/PaySuccessOrderAdapter.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,11 @@ protected void onBindChildViewHolder(@NonNull BaseViewHolder<ViewDataBinding> ho
4141
String text = "支付成功,订单号:" + bean.orderInfo.orderNo + ",订单名称" + bean.orderInfo.orderName
4242
+ ",物流:" + bean.orderInfo.otherOrderData.emsNo;
4343

44-
int absState = getCurrentPositionInfo().mAbsState;
45-
if ((absState & ItemAdapterPositionInfo.ABS_STATE_FIRST_LIST_POSITION) != 0) {
44+
ItemAdapterPositionInfo info = getCurrentPositionInfo();
45+
if (info.isFirst()) {
4646
text += ",整个列表第一个";
4747
}
48-
if ((absState & ItemAdapterPositionInfo.ABS_STATE_LAST_LIST_POSITION) != 0) {
48+
if (info.isLast()) {
4949
text += ",整个列表最后一个";
5050
}
5151
tv.setText(text);

app/src/main/java/com/wang/example/msg/adapter/TextAdapter.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,11 @@ protected void onBindChildViewHolder(@NonNull BaseViewHolder<ViewDataBinding> ho
3939
TextView tv = (TextView) holder.itemView;
4040
String text = "这是文字:" + bean.textInfo.text;
4141

42-
int absState = getCurrentPositionInfo().mAbsState;
43-
if ((absState & ItemAdapterPositionInfo.ABS_STATE_FIRST_LIST_POSITION) != 0) {
42+
ItemAdapterPositionInfo info = getCurrentPositionInfo();
43+
if (info.isFirst()) {
4444
text += ",整个列表第一个";
4545
}
46-
if ((absState & ItemAdapterPositionInfo.ABS_STATE_LAST_LIST_POSITION) != 0) {
46+
if (info.isLast()) {
4747
text += ",整个列表最后一个";
4848
}
4949
tv.setText(text);

app/src/main/java/com/wang/example/msg/adapter/UnsupportedAdapter.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,11 @@ protected void onBindChildViewHolder(@NonNull BaseViewHolder<ViewDataBinding> ho
3232
TextView tv = (TextView) holder.itemView;
3333
String text = "这是新版本的消息类型";
3434

35-
int absState = getCurrentPositionInfo().mAbsState;
36-
if ((absState & ItemAdapterPositionInfo.ABS_STATE_FIRST_LIST_POSITION) != 0) {
35+
ItemAdapterPositionInfo info = getCurrentPositionInfo();
36+
if (info.isFirst()) {
3737
text += ",整个列表第一个";
3838
}
39-
if ((absState & ItemAdapterPositionInfo.ABS_STATE_LAST_LIST_POSITION) != 0) {
39+
if (info.isLast()) {
4040
text += ",整个列表最后一个";
4141
}
4242
tv.setText(text);

app/src/main/java/com/wang/example/msg/adapter/WaitPayOrderAdapter.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,14 +34,14 @@ public void onItemClick(@NonNull View view, int position) {
3434
@Override
3535
protected void onBindChildViewHolder(@NonNull BaseViewHolder<AdapterMsgWaitPayOrderBinding> holder, OrderBean bean) {
3636
String text = "列表状态:";
37-
int absState = getCurrentPositionInfo().mAbsState;
38-
if ((absState & ItemAdapterPositionInfo.ABS_STATE_FIRST_LIST_POSITION) != 0) {
37+
ItemAdapterPositionInfo info = getCurrentPositionInfo();
38+
if (info.isFirst()) {
3939
text += "整个列表第一个";
4040
}
41-
if ((absState & ItemAdapterPositionInfo.ABS_STATE_LAST_LIST_POSITION) != 0) {
41+
if (info.isLast()) {
4242
text += "整个列表最后一个";
4343
}
44-
if ((absState & ItemAdapterPositionInfo.ABS_STATE_CENTER_POSITION) != 0) {
44+
if (info.isCenter()) {
4545
text += "列表中间";
4646
}
4747
holder.getBinding().btState.setText(text);

0 commit comments

Comments
 (0)