RecyclerView,ViewHolder和Adapter

RecyclerView

想要展示列表View,要使用RecyclerView。只使用Adapter创建充满屏幕的ViewHolder,切换视图时回收上一个视图。

RecycleView的任务仅限于回收和定位屏幕上的ViewHolder。能够显示数据还需要另外两个类的支持。

ViewHolder

ViewHolder只做一件事,容纳一个View视图。RecyclerView不断创建ViewHolder.

Adapter

Adapter是一个控制器对象,从模型层获取数据然后提供给RecyclerView显示。负责:

  • 创建必要的ViewHolder
  • 绑定ViewHolder至模型层数据

首先,RecyclerView调用Adapter的getItemCount方法,询问有多少个对象。

接着,RecyclerView调用Adapter的onCreateViewHolder方法创建ViewHolder。

最后,RecyclerView会传入ViewHolder的位置,调用Adapter的onBindViewHolder方法绑定到ViewHolder视图上。

实现

首先创建一个ListFragment.java文件

onCreateView

inflater将xml文件转换成view

这里必须调用LayoutManger,因为RecycleView不会自己摆放列表项。

updateUI将RecyclerView与Adapter关联

ViewHolder

在ViewHolder中定义bind方法,方便在Adapter中的onBindViewHolder中调用。

updateUI

Adapter

private class ItemAdapter extends RecyclerView.Adapter {
        private List<Crime> mCrimes;

        public ItemAdapter(List<Crime> crimes) {
            mCrimes = crimes;
        }

        @NonNull
        @Override
        public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            //recycleView需要新的viewHolder显示列表项时,会调用此方法
            LayoutInflater layoutInflater = LayoutInflater.from(getActivity());
            if (viewType == 1) {
                return new PoliceHolder(layoutInflater, parent);
            } else {
                return new CrimeHolder(layoutInflater, parent);
            }
        }

        @Override
        public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
            Crime crime = mCrimes.get(position);//拿到相应位置的数据
            if (this.getItemViewType(position) == 1) {
                ((PoliceHolder) holder).bind(crime);
            } else {
                ((CrimeHolder) holder).bind(crime);
            }

        }

        @Override
        public int getItemCount() {
            return mCrimes.size();//取得itemView的数目
        }

        @Override
        public int getItemViewType(int position) {
            if (mCrimes.get(position).isRequiresPolice()) {
                return 1;//表示需要警察的item 设置1,2方便添加更多情况
            } else {
                return 0;
            }
        }
    }

构造方法传入由updateUI创建的List<crime>,Adapter根据不同的ViewType创建viewHolder。

Comments are closed.