0.前言
本文目的主要是通过自定义个adapter来学习adapter内各个回调方法的含义。
那么提前先把要分析的本文的重点罗列出来。
- Adapter#onCreateViewHolder //主流程
- Adapter#onBindViewHolder //主流程
- Adapter#convert //解耦
- ViewHolder#get //扩展,渲染
- ViewHolder#getView //扩展
1.自定义ViewHolder
public class ViewHolder extends RecyclerView.ViewHolder {
private SparseArray<View> mViews;
private View mConvertView;
public ViewHolder(Context context, View itemview, ViewGroup parent) {
super(itemview);
mConvertView = itemview;
mViews = new SparseArray<View>();
}
public static ViewHolder get(Context context, ViewGroup parent, int layoutid) {
View itemview = LayoutInflater.from(context).inflate(layoutid, parent, false);
ViewHolder holder = new ViewHolder(context, itemview, parent);
return holder;
}
public <T extends View> T getView(int viewid) {
View view = mViews.get(viewid);
if (view == null) {
view = mConvertView.findViewById(viewid);
mViews.put(viewid, view);
}
return (T) view;
}
}
ViewHolder作为RecyclerView的条目容器,它穿梭于adapter的俩个方法之间,一个是onCreateViewHolder(初始化),一个是OnBinderViewHolder。这俩方法待会说,我们先分析下代码。
get()
这个方法名儿随便起,内容主要就是进行一个条目的渲染,这里很重要,一些扩展的封装会涉及在这里,比如下一篇文章我们要封装的HeaderView,会在这里来判断。
getView()
根据id获取view的方法。一个扩展功能。
2.自定义MyAdapter
onCreateViewHolder
在这里进行条目的渲染。
convert
为了解耦,抽象封装的一个方法。
onBindViewHolder
为条目进行布局。若是监测到是header或是footer则不进行常规布局。
getItemCount
获取列表长度。
getItemViewType
这个方法在本例内没体现,但是在下一篇中会出现,它主要就是用来判断header条目的。这么判断?public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
,这个方法第三个参数返回的就是这个方法内写好的返回逻辑。
package android.zj.com.rcvheaderdemo;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.ViewGroup;
import android.widget.AdapterView;
import java.util.List;
public abstract class MyAdapter<T> extends RecyclerView.Adapter<ViewHolder> {
private Context mContext;
private int mLayoutid;
private List<T> mDatas;
private AdapterView.OnItemClickListener monItemClickListener = null;
public MyAdapter(Context mContext, int mLayoutid, List<T> mDatas) {
this.mContext = mContext;
this.mLayoutid = mLayoutid;
this.mDatas = mDatas;
}
/**
* inflate操作
* */
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
ViewHolder viewHolder = ViewHolder.get(mContext, parent, mLayoutid);
return viewHolder;
}
/**
* 暴露出来的接口
*
* @param holder
* @param position
*/
public abstract void convert(ViewHolder holder, T position);
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
convert(holder, mDatas.get(position));
}
/**
* 获取高度
*
* @return
*/
@Override
public int getItemCount() {
if (mDatas == null) {
return 0;
}
return mDatas.size();
}
}
3.测试类编写
package android.zj.com.rcvheaderdemo;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private RecyclerView mRecyclerView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mRecyclerView = findViewById(R.id.rcv);
mRecyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this, LinearLayoutManager.VERTICAL,false));
List arr = new ArrayList();
for (int i = 0; i < 15; i++) {
arr.add("" + i);
}
MyAdapter mMyAdapter = new MyAdapter(MainActivity.this, R.layout.item_hot_phone_search, arr) {
@Override
public void convert(ViewHolder holder, Object position) {
}
};
mRecyclerView.setAdapter(mMyAdapter);
}
}
4.Demo:
https://github.com/zj614android/customRcAdapter
5.Thanks
基本方法1:https://blog.csdn.net/qibin0506/article/details/49716795
基本方法2:https://blog.csdn.net/qq_38228254/article/details/78374348
rcv设计思想:https://www.jianshu.com/p/9ddfdffee5d3