個(gè)人知識(shí)總結(jié):View篇--RecyclerView

A flexible view for providing a limited window into a large data set.

以上是Google api對(duì)于RecyclerView的介紹,RecyclerView用于為大型數(shù)據(jù)集提供有限的窗口,與ListView一樣是一個(gè)列表類型的控件,不過(guò)RecyclerView比ListView更加靈活,RecyclerView不進(jìn)可以在垂直方向顯示列表,還可以在水平方向顯示列表,亦可以像GridView一樣顯示網(wǎng)格列表。

RecyclerView的使用

RecyclerView和ListView的基本使用時(shí)一致的,都是需要一個(gè)數(shù)據(jù)源,一個(gè)列表樣式適配器,不過(guò)相較于ListView,RecyclerView需要加入依賴,因?yàn)镽ecyclerView并不是原生的控件,而是放在support包里面的:

compile 'com.android.support:recyclerview-v7:28.0.0'

加入依賴包之后就可以在布局文件xml里面正常引用了:

<android.support.v7.widget.RecyclerView
        android:id="@+id/recycle_data"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/color_white"/>
RecyclerView的布局Manager

之前也有提到過(guò),RecyclerView可以實(shí)現(xiàn)ListView一樣的列表樣式,也可以實(shí)現(xiàn)GridView一樣的網(wǎng)格樣式,更可以實(shí)現(xiàn)RecyclerView獨(dú)有的瀑布流樣式(當(dāng)然自定義也可以實(shí)現(xiàn)瀑布流),都要?dú)w功于RecyclerView的LayoutManager:

  • LinerLayoutManager(線性):以垂直或者水平列表方式展示Item
  • GridLayoutManager (網(wǎng)格):以網(wǎng)格方式展示Item
  • StaggeredGridLayoutManager(瀑布流): 以瀑布流方式展示Item
    簡(jiǎn)單的使用方法如下所示:
//垂直方向的線性列表布局
        LinearLayoutManager verticalLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
        //水平方向的線性列表布局
        LinearLayoutManager horizontalLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);
        //網(wǎng)格樣式布局
        GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 3);
        //瀑布流布局
        StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);

        recyclerView.setLayoutManager(verticalLayoutManager);

當(dāng)然,每一個(gè)Manager的參數(shù)有什么含義,感興趣的可以查看源碼更深入的去了解,但是基本上重寫RecyclerView去實(shí)現(xiàn)更加多樣的效果的新控件,也基本上是不會(huì)動(dòng)Manager的。

RecyclerView的適配器Adapter

之前有提到ListView的適配器Adapter的使用和相關(guān)的優(yōu)化方式,而RecyclerView的Adapter都完美的繼承并優(yōu)化了ListView的適配器的優(yōu)點(diǎn)。但是,RecyclerView的適配器還是有些地方?jīng)]有實(shí)現(xiàn),就是每一項(xiàng)的點(diǎn)擊事件,按照Google官方給的答復(fù)是,使用者可以自定義點(diǎn)擊事件,更加靈活方便,Adapter的簡(jiǎn)單使用如下:

public class RecyclerTestAdapter extends RecyclerView.Adapter<RecyclerTestAdapter.ViewHolder> {

    private List<String> dataList;
    private Context mContext;
    private OnTestAdapterClickListener mOnTestAdapterClickListener;

    public RecyclerTestAdapter(List<String> dataList, Context context) {
        this.dataList = dataList;
        mContext = context;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(mContext).inflate(R.layout.item_recycler_view, viewGroup, false);
        ViewHolder viewHolder = new ViewHolder(view);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder viewHolder, final int i) {
        viewHolder.tvText.setText(dataList.get(i));
        viewHolder.llRoot.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mOnTestAdapterClickListener != null) {
                    mOnTestAdapterClickListener.onItemClick(i);
                }
            }
        });
        viewHolder.tvText.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mOnTestAdapterClickListener != null) {
                    mOnTestAdapterClickListener.onTextClick(i);
                }
            }
        });
    }

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

    public void setOnTestAdapterClickListener(OnTestAdapterClickListener onTestAdapterClickListener) {
        mOnTestAdapterClickListener = onTestAdapterClickListener;
    }

    public static class ViewHolder extends RecyclerView.ViewHolder {

        LinearLayout llRoot;
        TextView tvText;
        
        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            llRoot = itemView.findViewById(R.id.item_root);
            tvText = itemView.findViewById(R.id.tv_item_text);
        }
    }
    
    public interface OnTestAdapterClickListener{
        
        void onItemClick(int position);
        
        void onTextClick(int position);
    }
}

當(dāng)然更復(fù)雜的使用,需要多重寫一些adapter的其他方法,同一個(gè)列表根據(jù)下標(biāo),或者是其他的什么標(biāo)識(shí),根據(jù)情況來(lái)顯示不同樣式的布局,等等各種各樣的深度使用,這都需要深入的去查看源碼,研究學(xué)習(xí)使用。

RecyclerView的列表decoration和animator

RecyclerView的列表每一項(xiàng)的分割線顯示和ListView的顯示不一樣,ListView的分隔符可以在xml屬性里面設(shè)置,RecyclerView的分隔符使用的是單獨(dú)的一個(gè)類ItemDecoration,這是一個(gè)抽象類,如果想要自定義每一項(xiàng)之間的分隔符,就需要繼承ItemDecoration并重寫相關(guān)方法,注入自己想要的分隔符的效果。并通過(guò)add方法,添加到想要該效果的RecyclerView上面去:

recyclerView.addItemDecoration(new TestItemDecoration());

RecyclerView的列表每一項(xiàng)滑出屏幕、滑出屏幕都可以自定義出獨(dú)特的動(dòng)畫,可以用ItemAnimator這個(gè)抽象類,正常情況下,都是不設(shè)置,使用的是support包里面的默認(rèn)動(dòng)畫DefaultItemAnimator類,也可以繼承ItemAnimator類并重寫相關(guān)方法,只需要通過(guò)set方法設(shè)置一下就可以了:

recyclerView.setItemAnimator(new DefaultItemAnimator());
?著作權(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),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 感謝上帝,車剛剛發(fā)動(dòng),幸運(yùn)的是我在車上了 現(xiàn)在還在喘氣。。九點(diǎn)五十的汽車票,室友啊的一聲說(shuō)九點(diǎn)二十了,...
    寧古天空閱讀 186評(píng)論 0 0
  • 整整一個(gè)月沒(méi)有在簡(jiǎn)書上寫東西了,開(kāi)學(xué)前幾天因?yàn)樵诳础镀椒驳氖澜纭罚煲挥锌站统两袩o(wú)法自拔,九月份開(kāi)學(xué)后,每...
    涵芷依閱讀 261評(píng)論 0 0

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