Skip to content

Commit 183b0e9

Browse files
committed
BaseListAdapter 也不需要在构造时传入typecount, 可以通过注册的type,来计算出typeCount
1 parent a75b5c2 commit 183b0e9

4 files changed

Lines changed: 22 additions & 10 deletions

File tree

app/src/main/java/net/kmfish/sample/ListViewActivity.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,15 @@ protected void onCreate(Bundle savedInstanceState) {
2525
setContentView(R.layout.activity_list);
2626

2727
listView = (ListView) findViewById(R.id.listview);
28-
adapter = new BaseListAdapter(2);
28+
adapter = new BaseListAdapter();
29+
adapter.registerDataAndItem(TextModel.class, LineListItem1.class);
30+
adapter.registerDataAndItem(ImageModel.class, LineListItem2.class);
31+
2932
listView.setAdapter(adapter);
3033
setupAdapter(adapter);
3134
}
3235

3336
private void setupAdapter(BaseListAdapter adapter) {
34-
adapter.registerDataAndItem(TextModel.class, LineListItem1.class);
35-
adapter.registerDataAndItem(ImageModel.class, LineListItem2.class);
3637

3738
adapter.setNotifyOnChange(false);
3839
for (int i = 0, len = 30; i < len; i++) {

multitypelistviewadapter/src/main/java/net/kmfish/multitypelistviewadapter/BaseListAdapter.java

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,23 +16,21 @@ public class BaseListAdapter extends BaseAdapter implements NotifyDataSetChanged
1616

1717
private BaseArrayAdapter arrayAdapter;
1818

19-
private int typeCount;
20-
2119
private LayoutInflater mInflater;
2220

2321
private ListItemFactory itemFactory = new ClassListItemFactory();
2422

25-
public BaseListAdapter(int typeCount) {
26-
init(typeCount);
23+
public BaseListAdapter() {
24+
init();
2725
}
2826

29-
private void init(int typeCount) {
27+
private void init() {
3028
arrayAdapter = new BaseArrayAdapter(this);
31-
this.typeCount = typeCount;
3229
}
3330

3431
/**
3532
* 初始化Adapter时调用此方法注册数据类型和Item类型的映射关系
33+
* 注意: 需要在setAdapter之前调用!!
3634
* @param dataClz
3735
* @param itemClz
3836
*/
@@ -89,7 +87,13 @@ public boolean isEnabled(int position) {
8987

9088
@Override
9189
public int getViewTypeCount() {
92-
return typeCount;
90+
int count = itemFactory.getTypeCount();
91+
if (0 == count) {
92+
throw new RuntimeException(
93+
"registerDataAndItem() should be called before ListView.setAdapter(adapter)!");
94+
}
95+
96+
return itemFactory.getTypeCount();
9397
}
9498

9599
@Override

multitypelistviewadapter/src/main/java/net/kmfish/multitypelistviewadapter/ClassListItemFactory.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,4 +32,9 @@ public final ListItem create(Class dataType) {
3232
public final void registerDataType(Class dataType, Class<? extends ListItem> itemClz) {
3333
dataItemMap.put(dataType, itemClz);
3434
}
35+
36+
@Override
37+
public int getTypeCount() {
38+
return dataItemMap.size();
39+
}
3540
}

multitypelistviewadapter/src/main/java/net/kmfish/multitypelistviewadapter/ListItemFactory.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,6 @@ public interface ListItemFactory<T> {
1010

1111
void registerDataType(T dataType, Class<? extends ListItem> itemClz);
1212

13+
int getTypeCount();
14+
1315
}

0 commit comments

Comments
 (0)