RecyclerView 使用

RecyclerView 是一个增强版的 ListView,不仅可以实现和 ListView 同样的效果,还优化了 ListView 中存在的各种不足之处。目前官方更加推荐使用 RecyclerView。

学习了 RecyclerView,在此总结一下:

  • RecyclerView简介
  • RecyclerView 子类之 Viewholder
  • RecyclerView 子类之 Adapter
  • RecyclerView
  • 总结

RecyclerView简介

RecyclerView 只创建充满屏幕的 View。它的任务只是回收和定位屏幕上的View,其他的事情交给它的两个子类 ViewHolder 和 Adapter 处理,下面介绍这两个子类。

RecyclerView 子类之 Viewholder

Viewholder 的任务只是容纳 view 的视图。

  1. 如我在每个 view 上有一个 TextView,那么我在这个子类的构造函数中 itemView.findbyid(TextView),
@Override
public CrimeHolder(LayoutInflater inflater, ViewGroup parent) {
    super(inflater.inflate(R.layout.list_item_crime, parent, false));
    
    itemView.setOnClickListener(this);
    mTitleTextView =  itemView.findViewById(R.id.crime_title);
    mDateTextView = itemView.findViewById(R.id.crime_data);
    }
  1. 通过 onClick() 设置点击操作(实现了 View.OnClickListener 接口)
@Override
public void onClick(View view) {
    Toast.makeText(getActivity(),
            mCrime.getTitle() + " clicked!", Toast.LENGTH_SHORT)
            .show();
}
  1. 此外,假设这里有个 bind() 函数设置 TextView 的参数
public void bind(Crime crime) {
    mCrime = crime;
    mTitleTextView.setText(mCrime.getTitle());
    mDateTextView.setText(mCrime.getDate().toString());
}

RecyclerView 子类之 Adapter

  1. Adapter 是帮助 RecyclerView 创建 ViewHolder,Adapter 是一个控制器对象,从模型层获取数据,然后提供给 RecyclerView 显示,是沟通的桥梁。
  • 在 onCreatViewHolder() 中创建并返回 holder
@Override
 public CrimeHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    LayoutInflater layoutInflater = LayoutInflater.from(getActivity());
    return new CrimeHolder(layoutInflater, parent);
}
  1. 在 onBindViewHolde() 中绑定 ViewHolder 的数据至模型层
@Override
public void onBindViewHolder(CrimeHolder holder, int position) {
    Crime crime = mCrimes.get(position);
    holder.bind(crime);
}

  1. 这里基于之前的假设,通过 holder.bind() 传入数据到 holder。
 @Override
public void onBindViewHolder(CrimeHolder holder, int position) {
    Crime crime = mCrimes.get(position);
    holder.bind(crime);
}
  1. 这里通过构造函数把数据传到 Adapter 中。
public CrimeAdapter(List crimes) {
    mCrimes = crimes;
}
  1. 此外还有一个很重要的方法,得到 item 的数目
@Override
public int getItemCount() {
    return mCrimes.size();
}

RecyclerView 还得干点事

  1. 这里是用了 fragment,RecyclerView做的事情就是 setAdapter(),
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_crime_list, container, false);

    mCrimeRecyclerView =  view
            .findViewById(R.id.crime_recycler_view);
    mCrimeRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));

    updateUI();

    return view;
}

private void updateUI() {
    CrimeLab crimeLab = CrimeLab.get(getActivity());
    List crimes = crimeLab.getCrimes();

    mAdapter = new CrimeAdapter(crimes);
    mCrimeRecyclerView.setAdapter(mAdapter);
}

总结

说了这么多感觉还是好乱,现在来理一理思路。当 RecycleView 需要显示视图时,就会去找它的 Adapter 。首先,调用 Adapter 的 getItemCount(),得到数组的大小,接着 RecycleView 调用 Adapter 的 onCreatViewHoder(ViewGroup, int) 方法创建 ViewHolder 及其显示的视图,Adapter 就会找到并填充到 ViewHolder 的视图上。

RecyclerView 使用_第1张图片
流程示意图

github地址

你可能感兴趣的:(RecyclerView 使用)