引入
implementation ('com.alibaba.android:vlayout:1.0.7@aar') {
transitive = true
}
数据源
package com.zcf.myvlayout;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;
import com.github.nukc.LoadMoreWrapper.LoadMoreAdapter;
import com.rulerbug.bugutils.Domain.BugOkHttpDataList;
import com.rulerbug.bugutils.Utils.BugLogUtils;
import com.rulerbug.bugutils.Utils.BugOkHttpUtils;
import com.rulerbug.bugutils.Utils.BugThreadUtils;
import java.io.IOException;
import java.util.ArrayList;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Response;
public class MainViewModel extends ViewModel {
private final ArrayList<Integer> integers;
public ArrayList<Integer> getData(int size) {
ArrayList<Integer> list = new ArrayList<>();
for (int i = 0; i < size; i++) {
list.add(i);
}
return list;
}
public MutableLiveData<ArrayList<Integer>> liveData = new MutableLiveData<>();
public MainViewModel() {
integers = new ArrayList<>();
liveData.setValue(integers);
}
public void loadData(LoadMoreAdapter.Enabled enabled) {
BugOkHttpUtils.postHttp(Whole.URL, BugOkHttpUtils.getFormBody(new BugOkHttpDataList()
), new Callback() {
@Override
public void onFailure(Call call, IOException e) {
enabled.setLoadMoreEnabled(false);
}
@Override
public void onResponse(Call call, Response response) throws IOException {
BugLogUtils.e("onResponse");
integers.add(1);
integers.add(1);
integers.add(1);
integers.add(1);
integers.add(1);
integers.add(1);
integers.add(1);
integers.add(1);
integers.add(1);
integers.add(1);
integers.add(1);
integers.add(1);
integers.add(1);
integers.add(1);
liveData.postValue(integers);
enabled.setLoadMoreEnabled(false);
}
});
}
}
这是adapter
package com.zcf.myvlayout.Adapter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.databinding.DataBindingUtil;
import androidx.recyclerview.widget.RecyclerView;
import com.alibaba.android.vlayout.DelegateAdapter;
import com.alibaba.android.vlayout.LayoutHelper;
import com.alibaba.android.vlayout.layout.GridLayoutHelper;
import com.alibaba.android.vlayout.layout.StickyLayoutHelper;
import com.zcf.myvlayout.R;
import com.zcf.myvlayout.databinding.ItemLineBinding;
import com.zcf.myvlayout.databinding.ItemTextBinding;
import java.util.ArrayList;
public class MyStickAdapter extends DelegateAdapter.Adapter {
private StickyLayoutHelper helper;
private ArrayList<Integer> al;
public MyStickAdapter(StickyLayoutHelper helper, ArrayList<Integer> al) {
this.helper = helper;
this.al = al;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
ItemLineBinding itemTextBinding = DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()), R.layout.item_line, parent, false);
return new MyFirstViewHolder(itemTextBinding.getRoot());
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
ItemLineBinding item = DataBindingUtil.bind(holder.itemView);
item.setData(al.get(position) + "");
item.executePendingBindings();
}
@Override
public int getItemViewType(int position) {
return 4;
}
@Override
public int getItemCount() {
return al.size();
}
@Override
public LayoutHelper onCreateLayoutHelper() {
return helper;
}
public class MyFirstViewHolder extends RecyclerView.ViewHolder {
public MyFirstViewHolder(@NonNull View itemView) {
super(itemView);
}
}
}
写很多这样的adapter,重点
@Override
public int getItemViewType(int position) {
return 0;
}
这个type一定要有,每个adapter都要不一样
package com.zcf.myvlayout.Adapter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.databinding.DataBindingUtil;
import androidx.lifecycle.MutableLiveData;
import androidx.recyclerview.widget.RecyclerView;
import com.alibaba.android.vlayout.DelegateAdapter;
import com.alibaba.android.vlayout.LayoutHelper;
import com.alibaba.android.vlayout.layout.StaggeredGridLayoutHelper;
import com.alibaba.android.vlayout.layout.StickyLayoutHelper;
import com.rulerbug.bugutils.Utils.BugLogUtils;
import com.zcf.myvlayout.R;
import com.zcf.myvlayout.databinding.ItemTextBinding;
import java.util.ArrayList;
public class MyStaggeredGridAdapter extends DelegateAdapter.Adapter {
private StaggeredGridLayoutHelper helper;
private ArrayList<Integer> al;
public MyStaggeredGridAdapter(StaggeredGridLayoutHelper helper, ArrayList<Integer> al) {
this.helper = helper;
this.al = al;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
ItemTextBinding itemTextBinding = DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()), R.layout.item_text, parent, false);
return new MyFirstViewHolder(itemTextBinding.getRoot());
}
@Override
public int getItemViewType(int position) {
return 0;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
ItemTextBinding itemTextBinding = DataBindingUtil.bind(holder.itemView);
itemTextBinding.setData(al.get(position) + "");
itemTextBinding.executePendingBindings();
}
@Override
public int getItemCount() {
if (al== null) {
return 0;
}
return al.size();
}
@Override
public LayoutHelper onCreateLayoutHelper() {
return helper;
}
public class MyFirstViewHolder extends RecyclerView.ViewHolder {
public MyFirstViewHolder(@NonNull View itemView) {
super(itemView);
}
}
}
然后
val vLayoutManager = VirtualLayoutManager(this)
binding.rv.layoutManager = vLayoutManager;
val pool = RecyclerView.RecycledViewPool()
binding.rv.setRecycledViewPool(pool)
pool.setMaxRecycledViews(0, 20)
val adapter = DelegateAdapter(vLayoutManager, true)
binding.rv.adapter = adapter
给recylervierew绑定一个根适配器,一个布局,一个pool
然后把写的小适配器,加入根适配器
val myBinnerAdapter =
MyBinnerAdapter(LinearLayoutHelper(), vm.getData(1))
val gridLayoutHelper = GridLayoutHelper(4)
gridLayoutHelper.setMargin(0, 100, 0, 100)
val myGrideAdapter =
MyGrideAdapter(gridLayoutHelper, vm.getData(8))
val stickyLayoutHelper = StickyLayoutHelper()
val myStickAdapter =
MyStickAdapter(stickyLayoutHelper, vm.getData(1))
val staggeredGridLayoutHelper = StaggeredGridLayoutHelper(3, 10)
staggeredGridLayoutHelper.setMargin(10, 10, 10, 10)
val myStaggeredGridAdapter =
MyStaggeredGridAdapter(staggeredGridLayoutHelper, vm.getData(1024))
adapter.addAdapter(myBinnerAdapter)
adapter.addAdapter(myGrideAdapter)
adapter.addAdapter(myStickAdapter)
adapter.addAdapter(myStaggeredGridAdapter)
加上这个,可以加载更多数据
vm.liveData.observe(this, object : Observer<ArrayList<Int>> {
override fun onChanged(t: ArrayList<Int>?) {
staggeredGridAdapter.notifyDataSetChanged()
}
})
LoadMoreWrapper.with(adapter)
.setShowNoMoreEnabled(true)
.setNoMoreView(R.layout.item_nomore)
.setFooterView(R.layout.item_hasmore)
.setListener(object : LoadMoreAdapter.OnLoadMoreListener {
override fun onLoadMore(enabled: LoadMoreAdapter.Enabled?) {
vm.loadData(enabled)
}
})
.into(binding.rv);
结果
![](https://img-blog.csdnimg.cn/20200909175724109.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NpbmF0XzQwMzg3MTUw,size_16,color_FFFFFF,t_70)