版权声明:本文为博主原创文章,未经博主允许不得转载。https://blog.csdn.net/sinat_25074703/article/details/82959963
5、实现RecyclerView的适配器StaggeredAdapter
recyclerView的Adapter是完成数据缓存和装载功能的。官方解释如下:
Adapters provide a binding from an app-specific data set to views that are displayed within a {@link RecyclerView}.
翻译如下:适配器提供了一种绑定,把app指定的数据设置给显示在RecyclerView内将要被显示的view上。
我们可以知道,adapter主要完成规定数据和itemView的绑定逻辑。
RecyclerView.Adapter是一个抽象类,StaggeredAdapter继承该类必须实现getItemCount()、onCreateViewHolder(ViewGroup parent, int viewType)、onBindViewHolder(VH holder, int position)三个抽象方法
- getItemCount();
Returns the total number of items in the data set held by the adapter.
翻译:返回adapter的所有item数,不分类型
- onCreateViewHolder(ViewGroup parent, int viewType);
Called when RecyclerView needs a new {@link ViewHolder} of the given
type to represent an item.
@return A new ViewHolder that holds a View of the given view type.
翻译:当recyclerview需要一个新的ViewHolder时调用,这个ViewHolder是与指定类型的item一一对应的。
返回一个指定view 类型的ViewHolder
可见,不同的ViewType对应不同的ViewHolder,ViewType是int值。也就是说,我们可以定义多个整数代表不同的ViewType,定义不同的ViewHolder展示不同的item
- @see #getItemViewType(int)
- @see #onBindViewHolder(ViewHolder, int)
- getItemViewType(int position)
Return the view type of the item at
position
for the purposes of view recycling.
翻译:返回position处的ViewType,以便视图回收
有了ItemViewType,在onCreateViewHolder中自然可以创建对应的ViewHolder
- onBindViewHolder(VH holder, int position);
Called by RecyclerView to display the data at the specified
position. This method should update the contents of the {@link
ViewHolder#itemView} to reflect the item at the given position.
翻译:RecyclerView在指定位置显示数据时调用,用于更新ViewHolder持有的指定的某个itemView
通过以上分析可以知道,adapter通过getItemCount()方法获得item数,通过getItemViewType()获取每个位置的item对应的item类型,onCreateViewHolder()根据itemType创建ViewHolder为初始状态,说白了就是装载布局文件。最后onBindViewHolder()完成更新。
StaggeredAdapter.java代码如下:
package com.edwin.idea.staggered;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.util.Log;
import java.util.ArrayList;
import java.util.List;
/**
* Created by Edwin,CHEN on 2018/9/18.
*/
public class StaggeredAdapter extends RecyclerView.Adapter {
private static final String TAG = StaggeredAdapter.class.getSimpleName();
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
Log.d(TAG, "======onCreateViewHolder");
return null;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
Log.d(TAG, "======onBindViewHolder");
}
@Override
public int getItemCount() {
Log.d(TAG, "=====getItemCount");
return 0;
}
@Override
public int getItemViewType(int position) {
Log.d(TAG, "===getItemViewType");
return super.getItemViewType(position);
}
}
为了验证以上四个方法的执行顺序,将StaggeredAdapter设置给RecyclerView,在StaggeredFragment中做如下处理:
package com.edwin.idea.staggered;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.edwin.idea.AbstractFragment;
import com.edwin.idea.R;
/**
* Created by Edwin,CHEN on 2018/9/18.
*/
public class StaggeredFragment extends AbstractFragment {
ViewGroup viewGroupRoot;
RecyclerView recyclerView;
StaggeredGridLayoutManager staggeredGridLayoutManager;
StaggeredAdapter staggeredAdapter;
public static Fragment newInstance(){
return new StaggeredFragment();
}
@Nullable
@Overrid