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