如题:android oncreateviewholder,getItemViewType,onBindViewHolder方法什么时候调用?
这个是RecyclerView用于回调的方法,至于什么时候调用不需要关心,要关心的应该是他们的作用。
一下摘自我的博客,建议去看看:给新人的一些基础常识
复用的原理:首先listview(RecyclerView同理)会从第一个去加载view,当第10个时发现铺满全屏了,加载结束。现在你往下滑了一下,需要加载第11个,此时lv判断出第一个已经在屏幕外了,于是lv将第一个移除,放在了getView的convertView里,剩下的就是大家经常做的了,如下代码如果convertView不是null就将convertView拿来修修补补再返回给lv,如果是null(一般就是那前10个)就创建新的。
public final View getView(int position, View convertView, ViewGroup parent) {
VH holder;
if (convertView == null || convertView.getTag(R.id.tag_view_holder) == null) {
//模仿recyclerview,除了bind是position外,其他都是viewType
holder = onCreateViewHolder(parent, getItemViewType(position), mInflater);
holder.itemView.setTag(R.id.tag_view_holder, holder);
} else {
holder = (VH) convertView.getTag(R.id.tag_view_holder);
}
bindViewHolder(holder, position);
return holder.itemView;
}
RecyclerView就是把listview的if判断整个成了2个方法:onCreat和onBind
oncreateviewholder:当rv请求创建新的viewholder时,没有可复用的控件时会调用创建一个新的复用控件。此时就是大家熟知的new ViewHolder了。
onBindViewHolder:当rv要展示到ui页面上时。这就是我们设置数据的时候了,其中的holder有可能是上一次复用的view。
getItemViewType:获取当前position的所属的类别,为了实现展示不同样式的条目而用的(俗称多条目)。直接举例吧:做一个RecyclerView列表,需求是0-10ImageView,10-20TextView,20-30ImageView...以此循环。此时你会是懵逼的,因为onCreateViewHolder没有position,但他有viewType,这个其实就是RecyclerView调用你的getItemViewType得到的。
我们的getItemViewType为了区分ImageView和TextView的类别应该这样写:
@Override
public int getItemViewType(int position) {
if (position / 10 % 2 == 0) {//0-10是iv,10-20是tv,所以先除以10看看是不是奇偶数就行了
return 0;
} else {
return 1;
}
}
这时在onCreateViewHolder的时候就可以辨别了
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType==0){
//创建iv的viewholder
}else {
//创建tv的viewholder
}
}
而在onBindViewHolder没有viewType,因为我们也可以用position调getItemViewType呀:
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
int viewType = getItemViewType(position);
if (viewType==0){
//强制成tv的viewholder
TvViewHolder tvHolder = (TvViewHolder) holder;
tvHolder.mTv.setText("这是tv"+position);
}else {
//强制成iv的viewholder
IvViewHolder ivHolder = (IvViewHolder) holder;
ivHolder.mIv.setImageResource(R.drawable.xxx);
}
}
这样你就实现了每隔10个tv和iv的复用列表
为什么复用列表这么麻烦,像h5那种直接添加一列多简单?
虽然复用列表麻烦,但他理论上可以无限滑动下去并且内存都不带涨的,因为你滑来滑去就是那10来个控件修修补补而已,而像h5那种可以明显感受到滑的越多越卡。
问答版主就是牛,从现在起只回论坛,不在踏入问答半步