RecyclerView使用(一)

RecyclerView小部件比 ListView更高級且更具靈活性。 此小部件是一個用于顯示龐大數(shù)據(jù)集的容器,可通過保持有限數(shù)量的視圖進(jìn)行非常有效的滾動操作。 如果您有數(shù)據(jù)集合,其中的元素將因用戶操作或網(wǎng)絡(luò)事件而在運(yùn)行時發(fā)生改變,請使用RecyclerView小部件。——這是官方描述
RecyclerView官方文檔
12月8號出的 .cn官方API文檔

RecyclerView的系列的文章

我準(zhǔn)備通過一系列的文章講解如何使用RecyclerView,徹底拋棄ListView。為什么這么說,我們可以通過設(shè)置RecyclerView的LayoutManager,ItemDecoration , ItemAnimator實(shí)現(xiàn)各種效果。

  • LayoutManager(布局管理器):有三種:線性式布局LinearLayoutManager(相當(dāng)于ListView),表格式布局GridLayoutManager(相當(dāng)于GridView),瀑布式布局StaggeredGridLayoutManager(用來實(shí)現(xiàn)瀑布流)
  • ItemDecoration:控制Item間的間隔(隨便自定義)
  • ItemAnimator :控制Item的增加刪除的動畫(可自定義)
  • 控制點(diǎn)擊事件,長按事件,需要自己寫(之后會寫一篇文章介紹)
  • ItemTouchHelper:完成對RecyclerView的拖動與滑動刪除

一、一般使用步驟:

  • 準(zhǔn)備容器(設(shè)置recyclerView的相關(guān)操作)
  • 準(zhǔn)備數(shù)據(jù)(一般為從網(wǎng)上請求回的數(shù)據(jù))
  • 設(shè)置Adapter

1.準(zhǔn)備容器

  • 引包
第一步圖.png

第二步圖.png

第三步圖.png
  • 在xml寫RecyclerView控件
  • 設(shè)置它的相關(guān)操作
//初始化
RecyclerView rcShow = (RecyclerView) findViewById(R.id.rc_show);
//實(shí)例化,參數(shù)為context上下文
LinearLayoutManager manager = new LinearLayoutManager(this);
//設(shè)置布局管理器
rcShow.setLayoutManager(manager);

2.準(zhǔn)備數(shù)據(jù)

public void initData(){    
//實(shí)例化List    
list = new ArrayList<>();    
//循環(huán)添加數(shù)據(jù)    
for (int i = 0; i < 30; i++){
        list.add("這是第" + i + "個");    
      }
}

3.設(shè)置Adapter

  • 創(chuàng)建一個類,繼承RecyclerView.Adapter 注: 這個時候分兩種情況, 一種是只有一個ViewHolder時,寫<創(chuàng)建的ViewHolder內(nèi)部類>,另一種有多個ViewHolder時,不用寫<>,但是需要寫一個getItemViewType方法來判斷是哪一個view,哪一個ViewHolder,之后會詳細(xì)講
  • 繼承三個方法,onCreateViewHolder(創(chuàng)建視圖) onBindViewHolder(填充數(shù)據(jù)) getItemCount(獲取數(shù)量)。
  • 在這是寫一個xml用顯示item的布局
  • 切記切記切記:在創(chuàng)建視圖時,第二個參數(shù)要寫parent(創(chuàng)建視圖方法中的ViewGroup parent參數(shù)),否則顯示不正常。
  • 在ViewHolder(用來緩存)中初始化那些控件。
    View view = LayoutInflater.from(context).inflate(R.layout.main_item,parent,false);
public class MainAdapter extends RecyclerView.Adapter<MainAdapter.MainViewHolder> {

    private ArrayList<String> list;//要顯示的數(shù)據(jù)
    private Context context;//創(chuàng)建視圖時需要

    /*
    多參的構(gòu)造方法
     */
    public MainAdapter(ArrayList<String> list, Context context) {
        this.list = list;
        this.context = context;
    }

    /**
     * 創(chuàng)建視圖
     */
    @Override
    public MainViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        //創(chuàng)建視圖
        View view = LayoutInflater.from(context).inflate(R.layout.main_item,parent,false);
        //實(shí)例化MainViewHolder---- 傳View過去
        MainViewHolder holder = new MainViewHolder(view);
        return holder;
    }

    /**
     * 初始化控件
     */
    public class MainViewHolder extends RecyclerView.ViewHolder{
        TextView tvShow;

        public MainViewHolder(View itemView) {
            super(itemView);
            //初始化控件
            tvShow = (TextView)itemView.findViewById(R.id.tv_show);
        }
    }

    /**
     * 填充數(shù)據(jù)
     */
    @Override
    public void onBindViewHolder(MainViewHolder holder, int position) {
        //獲取要填充的值
        String content = list.get(position);
        //控件中設(shè)置值
        holder.tvShow.setText(content);       
    }

    /**
     * 獲取item的總個數(shù)
     */
    @Override
    public int getItemCount() {
        return list.size();
    }
}
  • 之后在Activity中
//實(shí)例化一個MainAdapter對象
MainAdapter adapter = new MainAdapter(list,MainActivity.this);
//設(shè)置adapter
rcShow.setAdapter(adapter);

二、其他布局使用

GridLayoutManager

第一個參數(shù)為context上下文,第二個參數(shù)想讓一行顯示幾個Item

//實(shí)例化
GridLayoutManagerGridLayoutManager gridLayoutManager = new GridLayoutManager(this,3);
//設(shè)置布局管理器
rcShow.setLayoutManager(gridLayoutManager);

注意,在Grid布局中也可以設(shè)置列表的Orientation屬性,來實(shí)現(xiàn)橫向和縱向的布局。
gridLayoutManager.setOrientation(GridLayoutManager.HORIZONTAL);

StaggeredGridLayoutManager

  • 第一個參數(shù)為一行(列)顯示幾個Item,第二個參數(shù)布局滾動的方向(StaggeredGridLayoutManager.VERTICAL 垂直,StaggeredGridLayoutManager.HORIZONTAL 水平)
//實(shí)例化StaggeredGridLayoutManager對象
StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL);
//設(shè)置布局管理器
rcShow.setLayoutManager(staggeredGridLayoutManager);

然后為了模擬瀑布流的高度
在之前填充數(shù)據(jù)的方法里

//實(shí)例化對象
Random random = new Random();
//獲取隨機(jī)的整數(shù)型數(shù)值
int height = random.nextInt(1001);
//設(shè)置TextView高度
holder.tvShow.setHeight(height);

然后就完了

三、設(shè)置Item的間隔(ItemDecoration)

  • 繼承 RecyclerView.ItemDecoration,重寫getItemOffsets的方法,對其參數(shù)outRect賦值即可。
public class SpacesItemDecoration extends RecyclerView.ItemDecoration {

    private int space;

    public SpacesItemDecoration(int space){
        this.space = space;
    }

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        super.getItemOffsets(outRect, view, parent, state);
        outRect.left=space;
        outRect.right=space;
        outRect.bottom=space;
        outRect.top=space;

    }
}
  • 在Activity中
//實(shí)例化SpacesItemDecoration對象
SpacesItemDecoration spacesItemDecoration = new SpacesItemDecoration(10);
//設(shè)置線寬
rcShow.addItemDecoration(spacesItemDecoration);

如果需要更復(fù)雜的使用,可以看這篇文章
http://blog.piasy.com/2016/03/26/Insight-Android-RecyclerView-ItemDecoration/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容