File tree Expand file tree Collapse file tree
app/src/main/java/net/kmfish/sample
multitypelistviewadapter/src/main/java/net/kmfish/multitypelistviewadapter Expand file tree Collapse file tree Original file line number Diff line number Diff 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 ++) {
Original file line number Diff line number Diff 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
Original file line number Diff line number Diff 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}
Original file line number Diff line number Diff 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}
You can’t perform that action at this time.
0 commit comments