ZUI易入门Android之Recyclerview

Recyclerview 

几个重要的角色

1、Recycler

管理那些已经废弃了的或者从RecyclerView中分离的item view用于复用,主要用于存的设计 

一共四层缓

  * 1.一级缓存:mAttachedScrap

    * 2.二级缓存:mCacheViews

    * 3.三级缓存:mViewCacheExtension

    * 4.四级缓存:mRecyclerPool

2LayoutManager

LayoutManager是一个抽象类,有3个子类:

LinearLayoutManager 线性布局管理器

GridLayoutManager 表格布局管理器

StaggeredGridLayoutManager 瀑布流布局管理器

 

3、Adapter

适配器设计模式,把相应数据Data展示到不同的 布局View 中。

4、高级用法

复杂条目、设置监听时机、缓存池的应用。

RecyclerView inflate 布局时  传入的三个参数 具体有什么关系?涉及系统源码

  1. root 不为null  attachToRoot 为 false子View会设置 root  LayoutParams。
  2. root 不为null  attachToRoot 为 ture,root view添加进来。
  3. root  null  RecycleView 会 默认给子View 生成一个默认的LayoutParams,所以会导致条目展示问题。

tryGetViewHolderForPositionByDeadline

Adapter简易封装及原理

  1. 使用的是RecyclerView中的Adapter
  2. 自定义ViewHolder
  3. SparseArray原理
  4. CharSequence与String的关系 富文本
//  创建View 然后进行缓存
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    if (viewType == ShanghaiBean.IShanghaiItemType.VERTICAL) {
        if (mIsHor) {
            Log.e("onCreateViewHolder", "VERTICAL");
        }
        View inflate = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_shanghai_fragment, parent,false);
        ShanghaiViewHolder viewHolder = new ShanghaiViewHolder(inflate);
        return viewHolder;
    } else if (viewType == ShanghaiBean.IShanghaiItemType.HORIZANTAL) {
        View inflate = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_shanghai_fragment_rv, null);
        ShanghaiViewHolderRv viewHolder = new ShanghaiViewHolderRv(inflate);
        return viewHolder;
    }
    return null;
}

// 绑定数据
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
    ShanghaiBean shanghaiBean = mData.get(position);
    if (holder instanceof ShanghaiViewHolder) {
        ((ShanghaiViewHolder) holder).mTv.setText(shanghaiBean.getmDec());
        ((ShanghaiViewHolder) holder).mIv.setVisibility(shanghaiBean.isShowImg()?View.VISIBLE:View.GONE);
        ((ShanghaiViewHolder) holder).itemView.setTag(position);
    } else if (holder instanceof ShanghaiViewHolderRv ){
        ((ShanghaiViewHolderRv) holder).mRecyclerView.setAdapter(new ShanghaiAdapter(mContext,shanghaiBean.getData(),true));
    }

}

// 条目的数量
@Override
public int getItemCount() {
    return mData.size();
}

@Override
public int getItemViewType(int position) {
    return mData.get(position).getmItemType();
}

// 缓存View  内存友好设计
public class ShanghaiViewHolder extends RecyclerView.ViewHolder {

    public TextView mTv;
    public ImageView mIv;

    public ShanghaiViewHolder(View itemView) {
        super(itemView);
        mTv = itemView.findViewById(R.id.item_shanghai_tv);
        mIv = itemView.findViewById(R.id.item_shanghai_iv);
        this.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ShanghaiDetailActivity.start_5_0(mContext,mIv);
            }
        });
    }
}

public class ShanghaiViewHolderRv extends RecyclerView.ViewHolder {

    public RecyclerView mRecyclerView;

    public ShanghaiViewHolderRv(View itemView) {
        super(itemView);
        mRecyclerView = itemView.findViewById(R.id.item_shanghai_rv);
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(mContext, LinearLayoutManager.HORIZONTAL, false);
        linearLayoutManager.setRecycleChildrenOnDetach(true);
        mRecyclerView.setLayoutManager(linearLayoutManager);
        mRecyclerView.setRecycledViewPool(recycledViewPool);
    }
}

你可能感兴趣的:(ZUI易入门Android)