Skip to content

Commit

Permalink
支持了emptyview
Browse files Browse the repository at this point in the history
  • Loading branch information
shark0017 committed Oct 5, 2016
1 parent 51974bb commit f718c90
Show file tree
Hide file tree
Showing 12 changed files with 525 additions and 275 deletions.
21 changes: 10 additions & 11 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,27 +6,26 @@

### 已解决的问题

- [x] 提升item的独立性,完美支持item被多处复用
- [x] item会根据type来做自动复用
- [x] 支持多种类型的item
- [x] 一个item仅会调用一次setViews(),避免重复建立监听器
- [x] 一个item仅会触发一次绑定视图的操作,提升效率
- [x] item会根据type来做自动复用
- [x] ​支持dataBinding和其他第三方注入框架
- [x] 支持通过item的构造方法来传入Activity对象
- [x] 支持通过item的构造方法来传入item中事件的回调
- [x] 提供了getConvertedData(data, type)方法来对item传入的数据做转换,方便拆包和提升item的复用性
- [x] 支持viewpager的正常加载模式和懒加载模式
- [x] 支持ViewPager的正常加载模式和懒加载模式
- [x] 提升item的独立性,完美支持item被多处复用
- [x] 一个item仅会触发一次绑定视图的操作,提升效率
- [x] 一个item仅会调用一次setViews(),避免重复建立监听器
- [x] 支持快速将ListView的适配器切换为recyclerView的适配器
- [x] 允许用viewpager的notifyDataSetChanged()来正常更新界面
- [x] 可以给recyclerView的添加头部和底部(利用了`RcvAdapterWrapper`
- [x] 支持适配器的数据自动绑定,只用操作数据便可,adapter会自动notify界面(需要配合databinding中的`ObservableList`
- [x] 可以给recyclerView的添加空状态(利用`RcvAdapterWrapper`
- [x] 可以给recyclerView的添加头部和底部(利用`RcvAdapterWrapper`
- [x] 提供了getCurrentPosition()来支持根据不同的位置选择不同item的功能
- [x] 提供了getConvertedData(data, type)方法来对item传入的数据做转换,方便拆包和提升item的复用性
- [x] 支持适配器的数据自动绑定,只用操作数据便可,adapter会自动notify界面(需要配合databinding中的`ObservableList`

### 示例

![](./demo/ios_demo.png)

**上图是在作者的授权下引用了设计师“流浪汉国宝(QQ:515288905)”在UI中国上的作品:http://www.ui.cn/detail/149952.html**
**上图是在作者的授权下引用了设计师“流浪汉国宝(QQ:515288905)”在UI中国上的[作品](http://www.ui.cn/detail/149952.html)**

我觉得这个设计很简洁清爽,未来可能会出这个设计的android实现。

Expand Down
8 changes: 4 additions & 4 deletions adapter/build.gradle
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
apply plugin: 'com.android.library'

android {
compileSdkVersion 23
buildToolsVersion "23.0.2"
compileSdkVersion 24
buildToolsVersion "24.0.2"

defaultConfig {
minSdkVersion 8
targetSdkVersion 23
targetSdkVersion 24
}

buildTypes {
Expand All @@ -25,6 +25,6 @@ android {

dependencies {
provided 'com.android.databinding:baseLibrary:1.0'
provided 'com.android.support:recyclerview-v7:23.2.1'
provided 'com.android.support:recyclerview-v7:24.2.1'
provided "org.projectlombok:lombok:1.12.6"
}
29 changes: 16 additions & 13 deletions adapter/src/main/java/kale/adapter/CommonRcvAdapter.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
* @author Jack Tony
* @date 2015/5/17
*/
public abstract class CommonRcvAdapter<T> extends RecyclerView.Adapter implements IAdapter<T> {
public abstract class CommonRcvAdapter<T> extends RecyclerView.Adapter<CommonRcvAdapter.RcvAdapterItem> implements IAdapter<T> {

private List<T> mDataList;

Expand All @@ -34,7 +34,7 @@ public CommonRcvAdapter(@Nullable List<T> data) {
if (data == null) {
data = new ArrayList<>();
}

if (DataBindingJudgement.SUPPORT_DATABINDING && data instanceof ObservableList) {
((ObservableList<T>) data).addOnListChangedCallback(new ObservableList.OnListChangedCallback<ObservableList<T>>() {
@Override
Expand All @@ -50,21 +50,24 @@ public void onItemRangeChanged(ObservableList<T> sender, int positionStart, int
@Override
public void onItemRangeInserted(ObservableList<T> sender, int positionStart, int itemCount) {
notifyItemRangeInserted(positionStart, itemCount);
notifyItemRangeChanged(positionStart, itemCount);
notifyChange(sender, positionStart);
}

@Override
public void onItemRangeRemoved(ObservableList<T> sender, int positionStart, int itemCount) {
notifyItemRangeRemoved(positionStart, itemCount);
notifyItemRangeChanged(positionStart, itemCount);
notifyChange(sender, positionStart);
}

@Override
public void onItemRangeMoved(ObservableList<T> sender, int fromPosition, int toPosition, int itemCount) {
// Note:不支持一次性移动"多个"item的情况!!!!
notifyItemMoved(fromPosition, toPosition);
notifyDataSetChanged();
notifyChange(sender, Math.min(fromPosition, toPosition));
}

private void notifyChange(ObservableList<T> sender, int start) {
onItemRangeChanged(sender, start, getItemCount() - start);
}

});
}
mDataList = data;
Expand Down Expand Up @@ -111,14 +114,14 @@ public Object getItemType(T t) {
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
public RcvAdapterItem onCreateViewHolder(ViewGroup parent, int viewType) {
return new RcvAdapterItem(parent.getContext(), parent, createItem(mType));
}

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
debug((RcvAdapterItem) holder);
((RcvAdapterItem) holder).item.handleData(getConvertedData(mDataList.get(position), mType), position);
public void onBindViewHolder(RcvAdapterItem holder, int position) {
debug(holder);
holder.item.handleData(getConvertedData(mDataList.get(position), mType), position);
}

@NonNull
Expand All @@ -136,13 +139,13 @@ public int getCurrentPosition() {
// 内部用到的viewHold
///////////////////////////////////////////////////////////////////////////

private static class RcvAdapterItem extends RecyclerView.ViewHolder {
static class RcvAdapterItem extends RecyclerView.ViewHolder {

protected AdapterItem item;

boolean isNew = true; // debug中才用到

protected RcvAdapterItem(Context context, ViewGroup parent, AdapterItem item) {
RcvAdapterItem(Context context, ViewGroup parent, AdapterItem item) {
super(LayoutInflater.from(context).inflate(item.getLayoutResId(), parent, false));
this.item = item;
this.item.bindViews(itemView);
Expand Down

0 comments on commit f718c90

Please sign in to comment.