咱们的目标是 No ViewHolder and No Adapter.html
官方的databinding
的确十分厉害,各类xml
绑定,而后自动生成一波文件,各类吊的飞起,不过容易让人抓不住重点。为了加深理解,我写了这个纯java版
的databindng
, 不须要xml
各类配置android:text="@{...}"
,同时进一步加了绑定Adapter
。java
时间仓促,只粗略的实现了小部分功能。基于注解的性能也有待优化,但它已经极大地提高了个人开发效率。以为它不错的话,能够一块儿维护这个项目,向
No ViewHolder
的目标迈进~android
实现这样一个带Header
, 带上拉加载
的列表须要多少代码呢?git
data -> view
的单向绑定Adapter
绑定。支持Header
和上拉加载
View
, 也没有Adapter
, 连ViewHoler
也没有。。。github.com/fashare2015…github
// 1. Add it in your root build.gradle at the end of repositories:
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
// 2. Add the dependency in your app/build.gradle
dependencies {
compile 'com.github.fashare2015:NoViewHolder:1.0.1'
}复制代码
这一块和官方差很少,只是xml
配置换成了java注解
配置。app
首先,你手头有一个javabean
,就是你在图中看到的妹子列表Item
如:maven
public class MeiZhi {
@BindImageView(id=R.id.iv_image, placeHolder = R.mipmap.ic_launcher)
public String url; // 把 url 绑定在 ImageView 上
@BindTextView(id=R.id.tv_title)
public String desc; // 把 desc 绑定在 TextView 上
}复制代码
基本等同于官方的android:text="@{meizhi.desc}"
,用过databinding
的话应该秒懂的。。。ide
固然,服务端返回的确定是个妹子的列表,你手头还会有一个HomeInfo
的东东。性能
public class HomeInfo {
// 妹子列表区
@BindRecyclerView(id = R.id.rv_meizhi, layout = R.layout.item_meizhi)
private List<MeiZhi> results = new ArrayList<>(); // 把 List 绑定在 RecyclerView 上
// banner
@BindViewPager(id = R.id.vp_banner, layout = R.layout.item_banner)
private List<MeiZhi> bannerInfo; // 把 List 绑定在 ViewPager 上
}复制代码
这部分是官方没有的,相应的还提供了 @BindListView
gradle
像上面的配置,banner
和妹子列表是分开的,不会一块儿滑动的。所以,提供了向RecyclerView
中添加Header
的注解——@BindRvHeader
.
让咱们把banner
加进RecyclerView
public class HomeInfo {
// 妹子列表区
@BindRecyclerView(id = R.id.rv_meizhi, layout = R.layout.item_meizhi)
private List<MeiZhi> results = new ArrayList<>(); // 把 List 绑定在 RecyclerView 上
// banner
@BindRvHeader(id = R.id.rv_meizhi, layout = R.layout.layout_banner, itemType = 0) // 增长这一行 !!!
@BindViewPager(id = R.id.vp_banner, layout = R.layout.item_banner)
private List<MeiZhi> bannerInfo; // 把 List 绑定在 ViewPager 上
}复制代码
提供了@BindItemClick
、@BindClick
public class MainActivity extends AppCompatActivity {
...
@BindItemClick(id = R.id.vp_banner)
NoOnItemClickListener<MeiZhi> clickBanner = (view, data, pos) -> toast("click Banner: " + pos + ", "+ data.toString());
@BindItemClick(id = R.id.rv_meizhi)
NoOnItemClickListener<MeiZhi> clickMeiZhi = (view, data, pos) -> toast("click MeiZhi: " + pos + ", "+ data.toString());
}复制代码
前面只是一系列绑定关系的配置,还须要一个接口触发他们:
更新UI
作准备mNoViewHolder = new NoViewHolder.Builder(this)
.initView(new HomeInfo()) // 必定要提供`注解信息`的类,不然没法初始化。
.build();复制代码
mNoViewHolder.notifyDataSetChanged(homeInfo);
homeInfo
里提供的注解信息,找到相应的控件,并把数据刷新上去。// 在请求的 onSuccess() 中刷新界面,本例使用了 Rxjava 和 lambda
homeInfoObservable.subscribe(homeInfo -> {
mHomeInfo.getResults().addAll(homeInfo.getResults()); // 更新 妹子列表 info
if(homeInfo.getResults().size() >= 6)
mHomeInfo.setBannerInfo(homeInfo.getResults().subList(0, 6)); // 更新 bannerInfo
mNoViewHolder.notifyDataSetChanged(mHomeInfo); // mHomeInfo 发生变化, 通知 UI 及时刷新
}复制代码
当你须要自定义的时候 (好比替换图片加载库,默认Glide
)。能够这样:
以下,即把@BindTextView
的行为override
掉了。
static NoViewHolder.Options mDataOptions = new NoViewHolder.DataOptions()
.setBehaviors(new BindTextView.Behavior() {
@Override
public void onBind(TextView targetView, BindTextView annotation, Object value) {
targetView.setText("fashare 到此一游" + value);
}
});
static {
NoViewHolder.setDataOptions(mDataOptions);
}复制代码
水平有限,实现的比较粗糙。但我以为这个思路还行,用起来简洁性也丝绝不比官方的差。以为它不错的话,能够一块儿维护这个项目,向No ViewHolder
的目标迈进~
github.com/hongyangAnd… (基于它封装的)