前言
一個(gè)不小心3個(gè)月沒有寫博客了吩跋,復(fù)習(xí)一下RecyclerView的使用吼鱼。
RecyclerView出現(xiàn)了這么多年了淳玩,每一次使用都要考慮怎樣用陵珍。這真的不能容忍了。
任務(wù)
自己動(dòng)手實(shí)戰(zhàn)一把型豁,注意下面的某些句子是摘抄的僵蛛。。迎变。
介紹
RecyclerView是support-v7包中的新組件充尉,是一個(gè)強(qiáng)大的滑動(dòng)組件,與經(jīng)典的ListView相比衣形,同樣擁有item回收復(fù)用的功能驼侠,這一點(diǎn)從它的名字Recyclerview即回收view也可以看出。
優(yōu)點(diǎn):
- RecyclerView封裝了viewholder的回收復(fù)用谆吴,也就是說RecyclerView標(biāo)準(zhǔn)化了ViewHolder倒源,編寫Adapter面向的是ViewHolder而不再是View了,復(fù)用的邏輯被封裝了句狼,寫起來更加簡(jiǎn)單笋熬。
- 提供了一種插拔式的體驗(yàn),高度的解耦腻菇,異常的靈活胳螟,針對(duì)一個(gè)Item的顯示RecyclerView專門抽取出了相應(yīng)的類,來控制Item的顯示筹吐,使其的擴(kuò)展性非常強(qiáng)旺隙。
- 可以控制Item增刪的動(dòng)畫,可以通過ItemAnimator這個(gè)類進(jìn)行控制骏令,當(dāng)然針對(duì)增刪的動(dòng)畫蔬捷,RecyclerView有其自己默認(rèn)的實(shí)現(xiàn)。
- Adapter:使用RecyclerView之前榔袋,你需要一個(gè)繼承自RecyclerView.Adapter的適配器周拐,作用是將數(shù)據(jù)與每一個(gè)item的界面進(jìn)行綁定。
- LayoutManager:用來確定每一個(gè)item如何進(jìn)行排列擺放凰兑,何時(shí)展示和隱藏妥粟。回收或重用一個(gè)View的時(shí)候吏够,LayoutManager會(huì)向適配器請(qǐng)求新的數(shù)據(jù)來替換舊的數(shù)據(jù)勾给,這種機(jī)制避免了創(chuàng)建過多的View和頻繁的調(diào)用findViewById方法(與ListView原理類似)滩报。
簡(jiǎn)單的RecyclerView使用方法
1.添加依賴
在AS的build.gradle中添加依賴,然后同步一下就可以引入依賴包:
dependencies {
...
compile 'com.android.support:recyclerview-v7:26.+'
}
2.布局文件
添加完依賴之后播急,就開始寫代碼了脓钾,與ListView用法類似,也是先在xml布局文件中創(chuàng)建一個(gè)RecyclerView的布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".baseUse.RecyclerActivity">
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</android.support.v7.widget.RecyclerView>
</RelativeLayout>
2.創(chuàng)建完布局之后在MainActivity中獲取這個(gè)RecyclerView桩警,并聲明LayoutManager與Adapter可训,代碼如下:
mRecyclerView = findViewById(R.id.recycler_view);
//創(chuàng)建默認(rèn)的線性LayoutManager
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
mRecyclerView.setLayoutManager(linearLayoutManager);
//創(chuàng)建并設(shè)置Adapter
mRecyclerView.setAdapter(new MyAdapter(myDatas));
3.Adapter的創(chuàng)建問題,是要繼承RecyclerView.Adapter這個(gè)類的捶枢。代碼如下:
public class MyAdapter extends RecyclerView.Adapter {
public String[] datas = null;
public MyAdapter(String[] datas) {
this.datas = datas;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_recycler, parent, false);
ViewHolder vh = new ViewHolder(view);
return vh;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (holder instanceof ViewHolder) {
((ViewHolder) holder).mTextView.setText(datas[position]);
}
}
@Override
public int getItemCount() {
return datas.length;
}
//自定義的ViewHolder握截,持有每個(gè)Item的的所有界面元素
class ViewHolder extends RecyclerView.ViewHolder {
public TextView mTextView;
public ViewHolder(View view) {
super(view);
mTextView = view.findViewById(R.id.tv_recycler);
}
}
}
主要的就是3個(gè)方法:
a) onCreateViewHolder()
這個(gè)方法主要生成為每個(gè)Item inflater出一個(gè)View,但是該方法返回的是一個(gè)ViewHolder烂叔。該方法把View直接封裝在ViewHolder中谨胞,然后我們面向的是ViewHolder這個(gè)實(shí)例,當(dāng)然這個(gè)ViewHolder需要我們自己去編寫蒜鸡。直接省去了當(dāng)初的convertView.setTag(holder)和convertView.getTag()這些繁瑣的步驟胯努。
b) onBindViewHolder()
這個(gè)方法主要用于適配渲染數(shù)據(jù)到View中。方法提供給你了一viewHolder而不是原來的convertView术瓮。
c) getItemCount()
這個(gè)方法就類似于BaseAdapter的getCount方法了,即總共有多少個(gè)條目贰健。
4.運(yùn)行
寫完這些代碼這個(gè)例子既可以跑起來了
總結(jié)
本節(jié)介紹的是一個(gè)最最簡(jiǎn)單的RecyclerView的使用方法胞四,后面將介紹一些更高級(jí)的用法。小伙伴們都會(huì)用了吧伶椿!