我以前一直使用BRVAH的adapter,非常好用,搭配databinding后,要是能夠在convert中可以直接拿到對應(yīng)的ViewDataBinding的話,我們的adapter就可以像如下這樣
@Override
protected void convert(MVViewHolder<MyBinding> helper, MyEntry item) {
helper.getDataViewBinding().setItem(item);
}
對具體的顯示,在xml中完成,就這么一句話就可以完成整個adapter展示內(nèi)容的綁定了,非常方便
,我們的綁定過程在我們自定義的viewholder中完成,它需要繼承BRVAH的BaseViewHolder,貼代碼
public class MVViewHolder<T extends ViewDataBinding> extends BaseViewHolder {
T binding = null;
public MVViewHolder(T binding) {
super(binding.getRoot());
binding.getRoot().setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
this.binding = binding;
}
public BaseViewHolder setQAdapter(BaseQuickAdapter adapter) {
super.setAdapter(adapter);
return this;
}
public T getDataViewBinding() {
return this.binding;
}
}
構(gòu)造函數(shù)通過傳入對應(yīng)的viewdatabinding來綁定,其中設(shè)置layoutparams是我在解決scrollview嵌套recycleview的過程中,出現(xiàn)展示一行解決的過程中,通過構(gòu)建binding的時候不傳入parent參數(shù)出現(xiàn)recycleview的item條目不能充滿父控件而寫的,大家可以根據(jù)自己的情況改動,setQAdapter后面會用,先不用管
接下來是最重要的自定義的adapter,先放代碼
public abstract class BaseQAdapter<T, D extends ViewDataBinding, K extends BaseViewHolder> extends BaseQuickAdapter<T, K> {
public BaseQAdapter(int layoutResId, @Nullable List<T> data) {
super(layoutResId, data);
}
public BaseQAdapter(@Nullable List<T> data) {
super(data);
}
public BaseQAdapter(int layoutResId) {
super(layoutResId);
}
@Override
public K onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType != LOADING_VIEW && viewType != HEADER_VIEW && viewType != EMPTY_VIEW && viewType != FOOTER_VIEW) {
D d = DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()), this.mLayoutResId, null, false);
d.executePendingBindings();
MVViewHolder mvViewHolder = new MVViewHolder(d);
bindViewClickListener(mvViewHolder);
mvViewHolder.setQAdapter(this);
return (K) mvViewHolder;
} else {
return super.onCreateViewHolder(parent, viewType);
}
}
private void bindViewClickListener(final BaseViewHolder baseViewHolder) {
if (baseViewHolder == null) {
return;
}
final View view = baseViewHolder.itemView;
if (view == null) {
return;
}
if (getOnItemClickListener() != null) {
view.setOnClickListener(v -> getOnItemClickListener().onItemClick(BaseQAdapter.this, v, baseViewHolder.getLayoutPosition() - getHeaderLayoutCount()));
}
if (getOnItemLongClickListener() != null) {
view.setOnLongClickListener(v -> getOnItemLongClickListener().onItemLongClick(BaseQAdapter.this, v, baseViewHolder.getLayoutPosition() - getHeaderLayoutCount()));
}
}
}
構(gòu)造函數(shù)和父類一樣,沒有改變,重要的是onCreateViewHolder中,為了看清楚為什么這樣寫,我們先看下父類中的onCreateViewHolder是怎么寫的
@Override
public K onCreateViewHolder(ViewGroup parent, int viewType) {
K baseViewHolder = null;
this.mContext = parent.getContext();
this.mLayoutInflater = LayoutInflater.from(mContext);
switch (viewType) {
case LOADING_VIEW:
baseViewHolder = getLoadingView(parent);
break;
case HEADER_VIEW:
baseViewHolder = createBaseViewHolder(mHeaderLayout);
break;
case EMPTY_VIEW:
baseViewHolder = createBaseViewHolder(mEmptyLayout);
break;
case FOOTER_VIEW:
baseViewHolder = createBaseViewHolder(mFooterLayout);
break;
default:
baseViewHolder = onCreateDefViewHolder(parent, viewType);
bindViewClickListener(baseViewHolder);
}
baseViewHolder.setAdapter(this);
return baseViewHolder;
}
可以看出,在BRVAH中的view ,主要包含的幾種類型,LOADING_VIEW,HEADER_VIEW,EMPTY_VIEW,FOOTER_VIEW, 分別在這里創(chuàng)建了viewholder,而我們關(guān)心的僅僅只是當中我們自己的view,因此在其他的地方,我返回的是super,接下來就是通過構(gòu)造把我們的binding傳進去,并把adapter以及一些點擊事件綁定,記得一定要綁定,不綁定點擊事件的話點擊事件無效,不綁定adapter的話會導(dǎo)致父類其他地方通過adapter找view的時候,出現(xiàn)空指針,弄好后看下超級簡單的具體用法
新建xml item_demo.xml
<?xml version="1.0" encoding="utf-8"?>
<layout>
<data>
<variable
name="name"
type="String"></variable>
</data>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{name}" />
</FrameLayout>
</layout>
adapter
public class MyDemoAdapter extends BaseQAdapter<String, ItemDemoBinding, MVViewHolder<ItemDemoBinding>> {
public MyDemoAdapter(@Nullable List<String> data) {
super(R.layout.item_demo, data);
}
@Override
protected void convert(MVViewHolder<ItemDemoBinding> helper, String item) {
helper.getDataViewBinding().setName(item);
helper.addOnClickListener(R.id.name);
}
}
再搭配databinding的屬性設(shè)置,看下我們的recycleview
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:bindLayoutManager="@{manager}"
android:loadMoreEnable="@{true}"
android:onChildItemClick="@{vm::OnItemChildClick"
android:onLoadMore="@{vm::onLoadMore}"
app:adapter="@{adapter}"></android.support.v7.widget.RecyclerView>
這樣就基本完成了,當然,這只是對basequickadapter的一個寫法,brvah的其他功能adapter也可以按著這個思路寫就好了