RecyclerView、Adapter和ViewHolder

RecyclerView是ListView的升级版,强化了ListView的某些不足。比如listView如果不使用一些技巧的话,listView的性能就会非常差;ListView只能实现纵向滚动的效果等。

顾名思义,ViewHolder只做一件事:容纳View视图

RecyclerView自身是不会创建视图,它创建的是ViewHolder,而ViewHolder引用这一个个itemView

如下图:


RecyclerView自己不会创建ViewHolder。这个任务实际是由adapter来完成的。adapter是个控制器对象,从模型层获取数据,然后提供给RecyclerView显示,起到桥梁的作用。

adapter负责:

1:创建必要的ViewHolder

2:绑定ViewHolder至模型层数据

recyclerView需要显示视图时,就会去找它的adapter。下图展示了一个recyclerView可能发起的会话。


首先,通过调用adapter的getItemCount()方法,RrecyclerView询问数组列表中包含多少个对象

接着,RecyclerView调用adapter的CreateViewHolder()方法创建ViewHolder以及ViewHolder要显示的视图。

最后,RecyclerView会传入ViewHolder及其位置,调用onBindViewHolder(ViewHolder,int position)方法。adapter会找到目标位置的数据并更新到ViewHolder的视图上。

具体代码如下;

private class CrimeHolder extends RecyclerView.ViewHolder 
        implements View.OnClickListener {

    private TextView mTitleTextView;
    private TextView mDateTextView;
    private CheckBox mSolvedCheckBox;

    private Crime mCrime;

    public CrimeHolder(View itemView) {
        super(itemView);
        itemView.setOnClickListener(this);

        mTitleTextView = (TextView) itemView.findViewById(R.id.list_item_crime_title_text_view);
        mDateTextView = (TextView) itemView.findViewById(R.id.list_item_crime_date_text_view);
        mSolvedCheckBox = (CheckBox) itemView.findViewById(R.id.list_item_crime_solved_check_box);
    }

    public void bindCrime(Crime crime) {   //在viewholder中实现的,所以还是可以说viewholder只是容纳视图
        mCrime = crime;
        mTitleTextView.setText(mCrime.getTitle());
        mDateTextView.setText(mCrime.getDate().toString());
        mSolvedCheckBox.setChecked(mCrime.isSolved());
    }

    @Override
    public void onClick(View v) {
        mCallbacks.onCrimeSelected(mCrime);
    }
}

private class CrimeAdapter extends RecyclerView.Adapter<CrimeHolder> {

    private List<Crime> mCrimes;

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

    @Override
    /*
    锁定视图R.layout.list_item_crime,绑定到ViewHolderCrimeHolder继承ViewHolder)中
     */
    public CrimeHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        LayoutInflater layoutInflater = LayoutInflater.from(getActivity());
        View view = layoutInflater.inflate(R.layout.list_item_crime, parent, false);
        return new CrimeHolder(view);
    }

    @Override
    /*
    viewHolder中的布局添加数据c
     */
    public void onBindViewHolder(CrimeHolder holder, int position) {
        Crime crime = mCrimes.get(position);
        holder.bindCrime(crime);
    }

    @Override
    public int getItemCount() {
        return mCrimes.size();
    }

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


搞定了adapter,最后要做的就是将它和RecyclerView关联起来,该方法创建adapter,然后设置给RecyclerView。代码如下所示

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_crime_list, container, false);

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

    if (savedInstanceState != null) {
        mSubtitleVisible = savedInstanceState.getBoolean(SAVED_SUBTITLE_VISIBLE);//得到saveInstanceState的值
    }

    updateUI();

    return view;
}

public void updateUI() {
    CrimeLab crimeLab = CrimeLab.get(getActivity());//得到CrimeLab对象
    List<Crime> crimes = crimeLab.getCrimes();//得到list对象

  
        mAdapter = new CrimeAdapter(crimes);//list对象添加到Adapter        mCrimeRecyclerView.setAdapter(mAdapter);//启用这个adapter


}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RecyclerViewAndroid提供的一个非常灵活的控件,用于显示大量数据的列表,它的核心是ViewHolder和AdapterViewHolder是RecyclerView的一个子类,它主要用于缓存item的视图,以便能够快速地滚动和重新使用这些视图。ViewHolder的实现非常简单,只需要继承RecyclerView.ViewHolder,然后在构造函数初始化视图,最后将视图绑定到ViewHolderAdapterRecyclerView的另一个子类,它主要用于管理数据和视图之间的关系。Adapter必须实现三个方法:onCreateViewHolder、onBindViewHolder和getItemCount。其onCreateViewHolder方法用于创建ViewHolder,onBindViewHolder方法用于将数据绑定到ViewHolder,getItemCount方法用于获取数据的数量。 以下是一个简单的RecyclerViewViewHolder和Adapter的实现示例: ViewHolder的实现: ``` public class MyViewHolder extends RecyclerView.ViewHolder { private TextView mTextView; public MyViewHolder(View itemView) { super(itemView); mTextView = itemView.findViewById(R.id.text_view); } public void bind(String text) { mTextView.setText(text); } } ``` Adapter的实现: ``` public class MyAdapter extends RecyclerView.Adapter<MyViewHolder> { private List<String> mData; public MyAdapter(List<String> data) { mData = data; } @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View itemView = LayoutInflater.from(parent.getContext()) .inflate(R.layout.item_view, parent, false); return new MyViewHolder(itemView); } @Override public void onBindViewHolder(MyViewHolder holder, int position) { holder.bind(mData.get(position)); } @Override public int getItemCount() { return mData.size(); } } ``` 在这个示例,我们创建了一个ViewHolder,它包含一个TextView,用于显示列表项的文本。我们还创建了一个Adapter,它管理一个字符串列表,并将每个字符串绑定到ViewHolder的TextView。 最后,我们需要将Adapter设置到RecyclerView: ``` RecyclerView recyclerView = findViewById(R.id.recycler_view); MyAdapter adapter = new MyAdapter(data); recyclerView.setAdapter(adapter); ``` 这样就可以显示一个简单的RecyclerView了。当我们滚动列表时,RecyclerView会自动回收不再需要的视图,并将它们重新用于新的列表项。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值