Skip to content

Commit 9e8ecf8

Browse files
author
hongyangAndroid
committed
大幅度重构,将listview与recyclerview分离
1 parent 5919908 commit 9e8ecf8

70 files changed

Lines changed: 2075 additions & 1043 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

README.md

Lines changed: 81 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,25 @@
11
# base-adapter
22
Android 万能的Adapter for ListView,RecyclerView,GridView等,支持多种Item类型的情况。
33

4-
[点击查看简单介绍](http://blog.csdn.net/lmj623565791/article/details/51118836)
54

65
## 引入
76

7+
### ForRecyclerView
8+
89
```
9-
compile 'com.zhy:base-adapter:2.0.0'
10+
compile 'com.zhy:base-rvadapter:3.0.2'
1011
```
1112

13+
### ForListView
14+
15+
```
16+
compile 'com.zhy:base-adapter:3.0.2'
17+
```
18+
19+
1220
## 使用
1321

14-
##(1)简单的数据绑定
22+
##(1)简单的数据绑定(ListView与其使用方式一致)
1523

1624
首先看我们最常用的单种Item的书写方式:
1725

@@ -37,99 +45,122 @@ mRecyclerView.setAdapter(new CommonAdapter<String>(this, R.layout.item_list, mDa
3745

3846
<img src="screenshot/single.png" width="320px"/>
3947

40-
##(2)多种ItemViewType
48+
##(2)多种ItemViewType(ListView与其使用方式一致)
49+
50+
对于多中itemviewtype的处理参考:https://github.com/sockeqwe/AdapterDelegates ,具有极高的扩展性。
4151

42-
多种ItemViewType,正常考虑下,我们需要根据Item指定ItemType,并且根据ItemType指定相应的布局文件。我们通过`MultiItemTypeSupport `完成指定:
4352

4453
```
45-
MultiItemTypeSupport multiItemSupport = new MultiItemTypeSupport<ChatMessage>()
54+
MultiItemTypeAdapter adapter = new MultiItemTypeAdapter(this,mDatas);
55+
adapter.addItemViewDelegate(new MsgSendItemDelagate());
56+
adapter.addItemViewDelegate(new MsgComingItemDelagate());
57+
```
58+
59+
每种Item类型对应一个ItemViewDelegete,例如:
60+
61+
```
62+
public class MsgComingItemDelagate implements ItemViewDelegate<ChatMessage>
4663
{
64+
4765
@Override
48-
public int getLayoutId(int itemType)
66+
public int getItemViewLayoutId()
4967
{
50-
//根据itemType返回item布局文件id
68+
return R.layout.main_chat_from_msg;
5169
}
5270
5371
@Override
54-
public int getItemViewType(int postion, ChatMessage msg)
72+
public boolean isForViewType(ChatMessage item, int position)
5573
{
56-
//根据当前的bean返回item type
74+
return item.isComMeg();
5775
}
58-
}
5976
60-
```
61-
剩下就简单了,将其作为参数传入到`MultiItemCommonAdapter `即可。
62-
63-
```
64-
mRecyclerView.setAdapter(new SectionAdapter<String>(this, mDatas, multiItemSupport)
65-
{
6677
@Override
67-
public void convert(ViewHolder holder, String s)
78+
public void convert(ViewHolder holder, ChatMessage chatMessage, int position)
6879
{
69-
holder.setText(R.id.id_item_list_title, s);
80+
holder.setText(R.id.chat_from_content, chatMessage.getContent());
81+
holder.setText(R.id.chat_from_name, chatMessage.getName());
82+
holder.setImageResource(R.id.chat_from_icon, chatMessage.getIcon());
7083
}
71-
});
84+
}
7285
```
7386

74-
7587
贴个效果图:
7688

7789
<img src="screenshot/rvadapter_01.png" width="360px"/>
7890

79-
##(3)添加分类header
80-
其实属于多种ItemViewType的一种了,只是比较常用,我们就简单封装下。
8191

82-
依赖正常考虑下,这种方式需要额外指定header的布局,以及布局中显示标题的TextView了,以及根据Item显示什么样的标题。我们通过`SectionSupport `对象指定:
92+
93+
94+
##(3) 添加HeaderView、FooterView
8395

8496
```
85-
SectionSupport<String> sectionSupport = new SectionSupport<String>()
86-
{
87-
@Override
88-
public int sectionHeaderLayoutId()
89-
{
90-
return R.layout.header;
91-
}
97+
mHeaderAndFooterWrapper = new HeaderAndFooterWrapper(mAdapter);
9298
93-
@Override
94-
public int sectionTitleTextViewId()
95-
{
96-
return R.id.id_header_title;
97-
}
99+
TextView t1 = new TextView(this);
100+
t1.setText("Header 1");
101+
TextView t2 = new TextView(this);
102+
t2.setText("Header 2");
103+
mHeaderAndFooterWrapper.addHeaderView(t1);
104+
mHeaderAndFooterWrapper.addHeaderView(t2);
98105
99-
@Override
100-
public String getTitle(String s)
101-
{
102-
return s.substring(0, 1);
103-
}
104-
};
106+
mRecyclerView.setAdapter(mHeaderAndFooterWrapper);
107+
mHeaderAndFooterWrapper.notifyDataSetChanged();
105108
```
106-
3个方法,一个指定header的布局文件,一个指定布局文件中显示title的TextView,最后一个用于指定显示什么样的标题(根据Adapter的Bean)。
107109

108-
接下来就很简单了:
110+
类似装饰者模式,直接将原本的adapter传入,初始化一个HeaderAndFooterWrapper对象,然后调用相关API添加。
111+
112+
##(4) 添加LoadMore
109113

110114
```
111-
mRecyclerView.setAdapter(new SectionAdapter<String>(this, R.layout.item_list, mDatas, sectionSupport)
115+
mLoadMoreWrapper = new LoadMoreWrapper(mOriginAdapter);
116+
mLoadMoreWrapper.setLoadMoreView(R.layout.default_loading);
117+
mLoadMoreWrapper.setOnLoadMoreListener(new LoadMoreWrapper.OnLoadMoreListener()
112118
{
113119
@Override
114-
public void convert(ViewHolder holder, String s)
120+
public void onLoadMoreRequested()
115121
{
116-
holder.setText(R.id.id_item_list_title, s);
117122
}
118123
});
124+
125+
mRecyclerView.setAdapter(mLoadMoreWrapper);
126+
119127
```
120-
这样就完了,效果图如下:
128+
直接将原本的adapter传入,初始化一个LoadMoreWrapper对象,然后调用相关API即可。
121129

122-
<img src="screenshot/rvadapter_02.png" width="360px"/>
130+
##(5)添加EmptyView
131+
132+
```
133+
mEmptyWrapper = new EmptyWrapper(mAdapter);
134+
mEmptyWrapper.setEmptyView(R.layout.empty_view);
135+
136+
mRecyclerView.setAdapter(mEmptyWrapper );
137+
138+
```
139+
140+
直接将原本的adapter传入,初始化一个EmptyWrapper对象,然后调用相关API即可。
141+
142+
143+
支持链式添加多种功能,示例代码:
144+
145+
```
146+
mAdapter = new EmptyViewWrapper(
147+
new LoadMoreWrapper(
148+
new HeaderAndFooterWrapper(mOriginAdapter)));
149+
```
123150

124151

125-
ListView的使用与RecyclerView基本一致,注意ListView对应的类路径为`com.zhy.base.adapter.abslistview`.
126152

127153
## 感谢
128154

155+
129156
* [https://github.com/JoanZapata/base-adapter-helper](https://github.com/JoanZapata/base-adapter-helper)
130157

131158
应该是我所知道的最早的对listview,gridview封装的adapter了,参考了其中很多,比如在`ViewHolder.setXXX`类的辅助方法。
132159

160+
* [https://github.com/sockeqwe/AdapterDelegates](https://github.com/sockeqwe/AdapterDelegates)
161+
162+
参考该库多种ItemType绑定数据方式
163+
133164
* [https://github.com/ragunathjawahar/simple-section-adapter](https://github.com/ragunathjawahar/simple-section-adapter)
134165

135166
`SectionAdapter`对其进行了参考。

base-adapter-library/base-adapter-library.iml

Lines changed: 35 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<?xml version="1.0" encoding="UTF-8"?>
2-
<module external.linked.project.id=":base-adapter-library" external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$/.." external.system.id="GRADLE" external.system.module.group="base-adapter" external.system.module.version="unspecified" type="JAVA_MODULE" version="4">
2+
<module external.linked.project.id=":base-adapter-library" external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$/.." external.system.id="GRADLE" external.system.module.group="baseAdapter" external.system.module.version="unspecified" type="JAVA_MODULE" version="4">
33
<component name="FacetManager">
44
<facet type="android-gradle" name="Android-Gradle">
55
<configuration>
@@ -12,10 +12,7 @@
1212
<option name="SELECTED_TEST_ARTIFACT" value="_android_test_" />
1313
<option name="ASSEMBLE_TASK_NAME" value="assembleDebug" />
1414
<option name="COMPILE_JAVA_TASK_NAME" value="compileDebugSources" />
15-
<option name="ASSEMBLE_TEST_TASK_NAME" value="assembleDebugAndroidTest" />
16-
<option name="COMPILE_JAVA_TEST_TASK_NAME" value="compileDebugAndroidTestSources" />
1715
<afterSyncTasks>
18-
<task>generateDebugAndroidTestSources</task>
1916
<task>generateDebugSources</task>
2017
</afterSyncTasks>
2118
<option name="ALLOW_USER_CONFIGURATION" value="false" />
@@ -29,67 +26,87 @@
2926
</component>
3027
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_7" inherit-compiler-output="false">
3128
<output url="file://$MODULE_DIR$/build/intermediates/classes/debug" />
32-
<output-test url="file://$MODULE_DIR$/build/intermediates/classes/androidTest/debug" />
29+
<output-test url="file://$MODULE_DIR$/build/intermediates/classes/test/debug" />
3330
<exclude-output />
3431
<content url="file://$MODULE_DIR$">
3532
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/r/debug" isTestSource="false" generated="true" />
3633
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/debug" isTestSource="false" generated="true" />
3734
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/debug" isTestSource="false" generated="true" />
3835
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/debug" isTestSource="false" generated="true" />
3936
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/debug" type="java-resource" />
40-
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/generated/debug" type="java-resource" />
37+
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/resValues/debug" type="java-resource" />
4138
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/r/androidTest/debug" isTestSource="true" generated="true" />
4239
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/androidTest/debug" isTestSource="true" generated="true" />
4340
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/androidTest/debug" isTestSource="true" generated="true" />
4441
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/androidTest/debug" isTestSource="true" generated="true" />
4542
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/androidTest/debug" type="java-test-resource" />
46-
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/generated/androidTest/debug" type="java-test-resource" />
43+
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/resValues/androidTest/debug" type="java-test-resource" />
4744
<sourceFolder url="file://$MODULE_DIR$/src/debug/res" type="java-resource" />
4845
<sourceFolder url="file://$MODULE_DIR$/src/debug/resources" type="java-resource" />
4946
<sourceFolder url="file://$MODULE_DIR$/src/debug/assets" type="java-resource" />
5047
<sourceFolder url="file://$MODULE_DIR$/src/debug/aidl" isTestSource="false" />
5148
<sourceFolder url="file://$MODULE_DIR$/src/debug/java" isTestSource="false" />
5249
<sourceFolder url="file://$MODULE_DIR$/src/debug/jni" isTestSource="false" />
5350
<sourceFolder url="file://$MODULE_DIR$/src/debug/rs" isTestSource="false" />
51+
<sourceFolder url="file://$MODULE_DIR$/src/debug/shaders" isTestSource="false" />
52+
<sourceFolder url="file://$MODULE_DIR$/src/testDebug/res" type="java-test-resource" />
53+
<sourceFolder url="file://$MODULE_DIR$/src/testDebug/resources" type="java-test-resource" />
54+
<sourceFolder url="file://$MODULE_DIR$/src/testDebug/assets" type="java-test-resource" />
55+
<sourceFolder url="file://$MODULE_DIR$/src/testDebug/aidl" isTestSource="true" />
56+
<sourceFolder url="file://$MODULE_DIR$/src/testDebug/java" isTestSource="true" />
57+
<sourceFolder url="file://$MODULE_DIR$/src/testDebug/jni" isTestSource="true" />
58+
<sourceFolder url="file://$MODULE_DIR$/src/testDebug/rs" isTestSource="true" />
59+
<sourceFolder url="file://$MODULE_DIR$/src/testDebug/shaders" isTestSource="true" />
5460
<sourceFolder url="file://$MODULE_DIR$/src/main/res" type="java-resource" />
5561
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
5662
<sourceFolder url="file://$MODULE_DIR$/src/main/assets" type="java-resource" />
5763
<sourceFolder url="file://$MODULE_DIR$/src/main/aidl" isTestSource="false" />
5864
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
5965
<sourceFolder url="file://$MODULE_DIR$/src/main/jni" isTestSource="false" />
6066
<sourceFolder url="file://$MODULE_DIR$/src/main/rs" isTestSource="false" />
67+
<sourceFolder url="file://$MODULE_DIR$/src/main/shaders" isTestSource="false" />
68+
<sourceFolder url="file://$MODULE_DIR$/src/test/res" type="java-test-resource" />
69+
<sourceFolder url="file://$MODULE_DIR$/src/test/resources" type="java-test-resource" />
70+
<sourceFolder url="file://$MODULE_DIR$/src/test/assets" type="java-test-resource" />
71+
<sourceFolder url="file://$MODULE_DIR$/src/test/aidl" isTestSource="true" />
72+
<sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
73+
<sourceFolder url="file://$MODULE_DIR$/src/test/jni" isTestSource="true" />
74+
<sourceFolder url="file://$MODULE_DIR$/src/test/rs" isTestSource="true" />
75+
<sourceFolder url="file://$MODULE_DIR$/src/test/shaders" isTestSource="true" />
6176
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
6277
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />
6378
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" />
6479
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/aidl" isTestSource="true" />
6580
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" />
6681
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/jni" isTestSource="true" />
6782
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />
83+
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/shaders" isTestSource="true" />
84+
<excludeFolder url="file://$MODULE_DIR$/build/docs" />
85+
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/annotations" />
6886
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/assets" />
87+
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/blame" />
6988
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/bundles" />
7089
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/classes" />
71-
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/coverage-instrumented-classes" />
7290
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/dependency-cache" />
73-
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/dex" />
74-
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/dex-cache" />
7591
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.android.support/recyclerview-v7/23.2.0/jars" />
7692
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.android.support/support-v4/23.2.0/jars" />
7793
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental" />
78-
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/jacoco" />
79-
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/javaResources" />
80-
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/libs" />
94+
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental-safeguard" />
95+
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/jniLibs" />
8196
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/lint" />
82-
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/manifests" />
83-
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/ndk" />
84-
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/pre-dexed" />
85-
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/proguard" />
8697
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/res" />
8798
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/rs" />
99+
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/shaders" />
88100
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/symbols" />
101+
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/transforms" />
102+
<excludeFolder url="file://$MODULE_DIR$/build/libs" />
89103
<excludeFolder url="file://$MODULE_DIR$/build/outputs" />
104+
<excludeFolder url="file://$MODULE_DIR$/build/publications" />
105+
<excludeFolder url="file://$MODULE_DIR$/build/reports" />
106+
<excludeFolder url="file://$MODULE_DIR$/build/test-results" />
90107
<excludeFolder url="file://$MODULE_DIR$/build/tmp" />
91108
</content>
92-
<orderEntry type="jdk" jdkName="Android API 23 Platform (1)" jdkType="Android SDK" />
109+
<orderEntry type="jdk" jdkName="Android API 23 Platform" jdkType="Android SDK" />
93110
<orderEntry type="sourceFolder" forTests="false" />
94111
<orderEntry type="library" exported="" name="support-v4-23.2.0" level="project" />
95112
<orderEntry type="library" exported="" name="recyclerview-v7-23.2.0" level="project" />

base-adapter-library/build.gradle

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,13 @@ dependencies {
2424
compile 'com.android.support:recyclerview-v7:23.2.0'
2525
}
2626

27+
2728
publish {
28-
userOrg = rootProject.userOrg
29-
groupId = rootProject.groupId
30-
artifactId = rootProject.artifactId
31-
publishVersion = rootProject.publishVersion
32-
desc = rootProject.description
33-
website = rootProject.website
34-
licences = rootProject.licences
29+
userOrg = 'hongyangandroid'
30+
groupId = 'com.zhy'
31+
artifactId = 'base-adapter'
32+
publishVersion = '3.0.2'
33+
desc = 'a easy adapter for listview , gridview . '
34+
website = 'https://github.com/hongyangAndroid/baseAdapter'
35+
licences = ['Apache-2.0']
3536
}

base-adapter-library/src/main/AndroidManifest.xml

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,5 @@
22
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
33
package="com.zhy.base.adapter" >
44

5-
<application
6-
>
7-
8-
</application>
95

106
</manifest>
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package com.zhy.adapter.abslistview;
2+
3+
import android.content.Context;
4+
5+
import com.zhy.adapter.abslistview.base.ItemViewDelegate;
6+
7+
import java.util.List;
8+
9+
public abstract class CommonAdapter<T> extends MultiItemTypeAdapter<T>
10+
{
11+
12+
public CommonAdapter(Context context, final int layoutId, List<T> datas)
13+
{
14+
super(context, datas);
15+
16+
addItemViewDelegate(new ItemViewDelegate<T>()
17+
{
18+
@Override
19+
public int getItemViewLayoutId()
20+
{
21+
return layoutId;
22+
}
23+
24+
@Override
25+
public boolean isForViewType(T item, int position)
26+
{
27+
return true;
28+
}
29+
30+
@Override
31+
public void convert(ViewHolder holder, T t, int position)
32+
{
33+
CommonAdapter.this.convert(holder, t, position);
34+
}
35+
});
36+
}
37+
38+
39+
protected abstract void convert(ViewHolder viewHolder, T item, int position);
40+
41+
}

0 commit comments

Comments
 (0)