Android5.0-RecyclerView

RecyclerView是谷歌V7包下新增的控件,用來替代ListView的使用,在RecyclerView標(biāo)準(zhǔn)化了ViewHolder類似于ListView中convertView用來做視圖緩.


RecyclerView vs AdapterView

  • item復(fù)用方面:RecyclerView內(nèi)置了RecyclerViewPool、多級(jí)緩存、ViewHolder,而AdapterView需要 手動(dòng)添加ViewHolder且復(fù)用功能也沒RecyclerView更加完善

  • 樣式豐富方面:RecyclerView通過支持水平、垂直和表格列表及其他更復(fù)雜形式,而AdapterView只支持具體某一種

  • 效果增強(qiáng)方面:RecyclerView內(nèi)置了ItemDecoration和ItemAnimator,可以自定義繪制itemView之間的一些特殊UI或item項(xiàng)數(shù)據(jù)變化時(shí)的動(dòng)畫效果,而用AdapterView實(shí)現(xiàn)時(shí)采取的做法是將這些特殊UI作為itemView的一部分,設(shè)置可見不可見決定是否展現(xiàn),且數(shù)據(jù)變化時(shí)的動(dòng)畫效果沒有提供,實(shí)現(xiàn)起來比較麻煩.

  • 代碼內(nèi)聚方面:RecyclerView將功能密切相關(guān)的類寫成內(nèi)部類,如ViewHolder,Adapter,而AdapterView沒有.

參考 RecyclerView源碼分析


模板Adapter

public class NormalRecyclerViewAdapter extends RecyclerView.Adapter<NormalRecyclerViewAdapter.NormalTextViewHolder> {
    private final LayoutInflater mLayoutInflater;
    private final Context mContext;
    private String[] mTitles;

    public NormalRecyclerViewAdapter(Context context) {
        mTitles = context.getResources().getStringArray(R.array.titles);
        mContext = context;
        mLayoutInflater = LayoutInflater.from(context);
    }

    @Override
    public NormalTextViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        return new NormalTextViewHolder(mLayoutInflater.inflate(R.layout.item_text, parent, false));
    }

    @Override
    public void onBindViewHolder(NormalTextViewHolder holder, int position) {
        holder.mTextView.setText(mTitles[position]);
    }

    @Override
    public int getItemCount() {
        return mTitles == null ? 0 : mTitles.length;
    }

    public static class NormalTextViewHolder extends RecyclerView.ViewHolder {
        @InjectView(R.id.text_view)
        TextView mTextView;

        NormalTextViewHolder(View view) {
            super(view);
            ButterKnife.inject(this, view);
            view.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Log.d("NormalTextViewHolder", "onClick--> position = " + getPosition());
                }
            });
        }
    }
}

實(shí)現(xiàn)

  1. 首先要用這個(gè)控件,你需要在gradle文件中添加包的引用(配合官方CardView使用)
compile 'com.android.support:cardview-v7:21.0.3'
compile 'com.android.support:recyclerview-v7:21.0.3'
  1. 在XML文件用使用它
<android.support.v7.widget.RecyclerView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/recycler_view"
    android:layout_centerVertical="true"
    android:layout_centerHorizontal="true"/>
  1. 在Activity中設(shè)置它
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));//這里用線性顯示 類似于listview
//  mRecyclerView.setLayoutManager(new GridLayoutManager(this, 2));//這里用線性宮格顯示 類似于grid view
//  mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(2, OrientationHelper.VERTICAL));//這里用線性宮格顯示 類似于瀑布流
mRecyclerView.setAdapter(new NormalRecyclerViewAdapter(this));

完整代碼,請(qǐng)戳我的github :jack_recyclerview_demo

參考資料

推薦閱讀

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • RecylerView簡介 RecylerView位置 RecylerView引用 Android Studio ...
    上善若水Ryder閱讀 3,962評(píng)論 2 8
  • 這篇文章分三個(gè)部分,簡單跟大家講一下 RecyclerView 的常用方法與奇葩用法;工作原理與ListView比...
    LucasAdam閱讀 4,720評(píng)論 0 27
  • 剛剛開始寫博客,拿一些簡單出來練練手,Demo地址就不貼出來了,RecyclerView的適配器我一直都是使用Ca...
    markzl閱讀 586評(píng)論 0 0
  • 又是忙碌的一天,現(xiàn)在才剛進(jìn)家門坐下。以前總覺得工作是理所應(yīng)當(dāng)每個(gè)人到這個(gè)年紀(jì)都必須做的但其實(shí)很多我們這個(gè)年紀(jì)的人還...
    銀色的光芒閱讀 223評(píng)論 1 1
  • 我媽喜歡鍋 我媽對(duì)鍋的熱愛已經(jīng)到了癡迷的地步,家里擺著大大小小的鍋,當(dāng)然還有不少還沒拆封的,我媽每周末都會(huì)把家...
    空空空以閱讀 299評(píng)論 0 1

友情鏈接更多精彩內(nèi)容