RecyclerView使用(一)

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

RecyclerView的系列的文章

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

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

一、一般使用步驟:

  • 準備容器(設置recyclerView的相關操作)
  • 準備數據(一般為從網上請求回的數據)
  • 設置Adapter

1.準備容器

  • 引包
第一步圖.png

第二步圖.png

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

2.準備數據

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

3.設置Adapter

  • 創建一個類,繼承RecyclerView.Adapter 注: 這個時候分兩種情況, 一種是只有一個ViewHolder時,寫<創建的ViewHolder內部類>,另一種有多個ViewHolder時,不用寫<>,但是需要寫一個getItemViewType方法來判斷是哪一個view,哪一個ViewHolder,之后會詳細講
  • 繼承三個方法,onCreateViewHolder(創建視圖) onBindViewHolder(填充數據) getItemCount(獲取數量)。
  • 在這是寫一個xml用顯示item的布局
  • 切記切記切記:在創建視圖時,第二個參數要寫parent(創建視圖方法中的ViewGroup parent參數),否則顯示不正常。
  • 在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;//要顯示的數據
    private Context context;//創建視圖時需要

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

    /**
     * 創建視圖
     */
    @Override
    public MainViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        //創建視圖
        View view = LayoutInflater.from(context).inflate(R.layout.main_item,parent,false);
        //實例化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);
        }
    }

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

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

二、其他布局使用

GridLayoutManager

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

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

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

StaggeredGridLayoutManager

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

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

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

然后就完了

三、設置Item的間隔(ItemDecoration)

  • 繼承 RecyclerView.ItemDecoration,重寫getItemOffsets的方法,對其參數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中
//實例化SpacesItemDecoration對象
SpacesItemDecoration spacesItemDecoration = new SpacesItemDecoration(10);
//設置線寬
rcShow.addItemDecoration(spacesItemDecoration);

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,505評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,556評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,463評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,009評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,778評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,218評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,281評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,436評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,969評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,795評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,993評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,537評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,229評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,659評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,917評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,687評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,990評論 2 374

推薦閱讀更多精彩內容