SKRecyclerViewAdapter 开源

SKRecyclerViewAdapter

Make RecyclerView.Adapter simpler

Support MutilType Layout , Kotlin, Functional Programming

Dependency

Include the library in your build.gradle

1
2
3
dependencies{
implementation 'com.lzd:skadapter:1.0.0'
}

Github : https://github.com/lzdon/SKAdapter

Usage

  1. 定义数据类
1
2
3
class Item1(val title: String, val subTitle: String)

class Item2(val title: String, val subTitle: String)
  1. 初始化adpter
1
2
3
4
5
6
7
8
9
10
11
12
13
14
private fun initView(view: View) {
val adapter = SKRecyclerViewAdapter<Any>()

adapter.register(ofSKHolderFactory<Item1>(layoutRes = R.layout.item1){
// bind view here
itemView.text1 = it.title
itemView.text2 = it.subTitle
})
adapter.register(ofSKHolderFactory<Item2>(layoutRes = R.layout.item2){
// bind view here
itemView.text1 = it.title
itemView.text2 = it.subTitle
})
}
  1. 注入数据
1
2
3
4
5
6
val result = arrayListOf<Any>()

result.add(Item1("title", "subTitle"))
result.add(Item2("title", "subTitle"))

adapter.setItems(result)
  1. kotlin只需上面三步,如果使用java,需要实现SKViewHolderSKViewHolderFactory
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
private void initView(View view) {
ActionCallback callback = (item, itemView) -> { };
SKRecyclerViewAdapter adapter = new SKRecyclerViewAdapter();
adapter.register(new ItemOneViewHolder.Factory(),new ItemTwoViewHolder.Factory(callback));
}

static class ItemOneViewHolder extends SKViewHolder<Item1> {

static class Factory extends SKViewHolderFactory<Item1>{

@NotNull
@Override
public SKViewHolder<Item1> createViewHolder(@NotNull ViewGroup viewGroup) {
View itemView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item1, viewGroup, false);
return new ItemOneViewHolder(itemView);
}
}

public ItemOneViewHolder(@NotNull View view) {
super(view);
}

@Override
public void onBind(@NotNull Item1 item) {
// bind view here
}
}

static class ItemTwoViewHolder extends SKViewHolder<Item2> {

static class Factory extends SKViewHolderFactory<Item2>{

private ActionCallback actionCallback;

// use constructor injection if you need a callback
public Factory(ActionCallback callback) {
this.actionCallback = callback;
}

@NotNull
@Override
public SKViewHolder<Item2> createViewHolder(@NotNull ViewGroup viewGroup) {
View itemView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item2, viewGroup, false);
return new ItemTwoViewHolder(itemView);
}
}

public ItemTwoViewHolder(@NotNull View view, ActionCallback callback) {
super(view);
itemView.setOnClickListener{v -> callback.onItemClick(item, itemView)}
}

@Override
public void onBind(@NotNull Item2 item) {
// bind view here
}
}

interface ActionCallback{
void onItemClick(Item1 item, View itemView);
}

More

  • SKPlaceHolderAdapter - 支持空提示、错误占位图的Adapter
    使用:
1
2
3
4
5
6
7
val adapter = SKPlaceHolderAdapter()
adapter.showErrorView{
// invoke when view clicked
}
adapter.showEmptyView{
// invoke when view clicked
}

定制自己的空提示、错误布局:

1
2
3
4
5
6
7
// global
sDefaultErrorFactory= ofSKHolderFactory(layoutRes = R.layout.custom_error) {
// bind view here
}
sDefaultEmptyFactory= ofSKHolderFactory(layoutRes = R.layout.custom_empty) {
// bind view here
}
1
2
3
4
5
6
7
8
// constructor injection
val emptyViewFactory = ofSKHolderFactory<EmptyViewData>(layoutRes = R.layout.custom_empty) {
// bind view here
}
val errorViewFactory = ofSKHolderFactory<ErrorViewData>(layoutRes = R.layout.custom_error) {
// bind view here
}
val adapter = SKPlaceHolderAdapter(emptyViewFactory, errorViewFactory)
  • SKAutoPageAdapter - 支持自动分页加载的Adapter
1
2
3
4
5
6
7
8
9
10
val adapter = SKAutoPageAdapter()
adapter.onLoadNextPage = {
// invoke when load next page
}
// first page
adapter.setPageItems(dataList, hasMore)
// append page
adapter.appendPageItems(dataList, hasMore)
// load failed
adapter.onLoadPageDataFailed()