特別聲明:
一蚓炬、前言
- 話說(shuō)RecyclerView已經(jīng)面市很久,也在很多應(yīng)用中得到廣泛的使用躺屁,在整個(gè)開(kāi)發(fā)者圈子里面也擁有很不錯(cuò)的口碑肯夏,那說(shuō)明RecyclerView擁有比ListView,GridView之類(lèi)控件有很多的優(yōu)點(diǎn),例如:數(shù)據(jù)綁定犀暑,Item View創(chuàng)建,View的回收以及重用等機(jī)制驯击。那么今天開(kāi)始我們來(lái)重點(diǎn)學(xué)習(xí)一下RecyclerView控件,本系列文章會(huì)包括到以下三個(gè)部分:
1. RecyclerView控件的基本使用,包括基礎(chǔ),進(jìn)階,高級(jí)部分,動(dòng)畫(huà)之類(lèi)
2. RecyclerView控件的實(shí)戰(zhàn)實(shí)例
3. RecyclerView控件集合AA(Android Annotations)注入框架實(shí)例
- 那么今天我們首先來(lái)看第一部分:RecyclerView控件的基本使用,進(jìn)階,動(dòng)畫(huà)相關(guān)知識(shí)點(diǎn)耐亏。本次講解所有用的Demo例子已經(jīng)全部更新到下面的項(xiàng)目中了徊都,歡迎大家star和fork。
FastDev4Android框架項(xiàng)目地址:https://github.com/jiangqqlmj/FastDev4Android
二广辰、RecyclerView基本介紹:
- 通過(guò)使用RecyclerView控件碟贾,我們可以在APP中創(chuàng)建帶有Material Design風(fēng)格的復(fù)雜列表币喧。RecyclerView控件和ListView的原理有很多相似的地方,都是維護(hù)少量的View來(lái)進(jìn)行顯示大量的數(shù)據(jù),不過(guò)RecyclerView控件比ListView更加高級(jí)并且更加靈活袱耽。當(dāng)我們的數(shù)據(jù)因?yàn)橛脩?hù)事件或者網(wǎng)絡(luò)事件發(fā)生改變的時(shí)候也能很好的進(jìn)行顯示杀餐。
- 和ListView不同的是,RecyclerView不用在負(fù)責(zé)Item的顯示相關(guān)的功能朱巨,在這邊所有有關(guān)布局,繪制,數(shù)據(jù)綁定等都被分拆成不同的類(lèi)進(jìn)行管理史翘,下面我這邊會(huì)一個(gè)個(gè)的進(jìn)行講解。同時(shí)RecyclerView控件提供了以下兩種方法來(lái)進(jìn)行簡(jiǎn)化和處理大數(shù)量集合:
1. 采用LayoutManager來(lái)處理Item的布局
2. 提供Item操作的默認(rèn)動(dòng)畫(huà)冀续,例如在增加或者刪除item的時(shí)候
-
你也可以自定義LayoutManager或者設(shè)置添加/刪除的動(dòng)畫(huà)琼讽,整體的RecyclerView結(jié)構(gòu)圖如下:
為了使用RecyclerView控件,我們需要?jiǎng)?chuàng)建一個(gè)Adapter和一個(gè)LayoutManager:
Adapter:繼承自RecyclerView.Adapetr類(lèi)洪唐,主要用來(lái)將數(shù)據(jù)和布局item進(jìn)行綁定钻蹬。
LayoutManager:布局管理器,設(shè)置每一項(xiàng)view在RecyclerView中的位置布局以及控件item view的顯示或者隱藏凭需。當(dāng)View重用或者回收的時(shí)候问欠,LayoutManger都會(huì)向Adapter來(lái)請(qǐng)求新的數(shù)據(jù)來(lái)進(jìn)行替換原來(lái)數(shù)據(jù)的內(nèi)容。這種回收重用的機(jī)制可以提供性能粒蜈,避免創(chuàng)建很多的view或者是頻繁的調(diào)用findViewById方法顺献。這種機(jī)制和ListView還是很相似的。
- RecyclerView提供了三種內(nèi)置的LayoutManager:
1. LinearLayoutManager:線性布局,橫向或者縱向滑動(dòng)列表
2. GridLayoutManager:表格布局
3. StaggeredGridLayoutManager:流式布局,例如瀑布流效果
當(dāng)然除了上面的三種內(nèi)部布局之外枯怖,我們還可以繼承RecyclerView.LayoutManager來(lái)實(shí)現(xiàn)一個(gè)自定義的LayoutManager注整。
Animations(動(dòng)畫(huà))效果:
RecyclerView對(duì)于Item的添加和刪除是默認(rèn)開(kāi)啟動(dòng)畫(huà)的。我們當(dāng)然也可以通過(guò)RecyclerView.ItemAnimator類(lèi)定制動(dòng)畫(huà)度硝,然后通過(guò)RecyclerView.setItemAnimator()方法來(lái)進(jìn)行使用肿轨。
- RecyclerView相關(guān)類(lèi):
類(lèi)名 | 說(shuō)明 |
---|---|
RecyclerView.Adapter | 可以托管數(shù)據(jù)集合,為每一項(xiàng)Item創(chuàng)建視圖并且綁定數(shù)據(jù) |
RecyclerView.ViewHolder | 承載Item視圖的子布局 |
RecyclerView.LayoutManager | 負(fù)責(zé)Item視圖的布局的顯示管理 |
RecyclerView.ItemDecoration | 給每一項(xiàng)Item視圖添加子View,例如可以進(jìn)行畫(huà)分隔線之類(lèi)的 |
RecyclerView.ItemAnimator | 負(fù)責(zé)處理數(shù)據(jù)添加或者刪除時(shí)候的動(dòng)畫(huà)效果 |
三蕊程、RecyclerView基本實(shí)現(xiàn):
- 我這邊實(shí)例采用Android Studio 1.3.2萝招。
1、添加庫(kù)依賴(lài):
dependencies {
…….
compile'com.android.support:recyclerview-v7:23.1.1'
}
2存捺、新建布局,引入RecyclerView控件:
<?xmlversionxmlversion="1.0" encoding="utf-8"?>
<LinearLayout xmlns:androidLinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"android:layout_width="match_parent"
android:layout_height="match_parent">
<includelayoutincludelayout="@layout/common_top_bar_layout"/>
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView_one"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="vertical"
></android.support.v7.widget.RecyclerView>
</LinearLayout>
3、在Activity中獲取RecyclerView控件然后進(jìn)行設(shè)置LayoutManger以及Adapter即可,和ListView的寫(xiě)法有點(diǎn)類(lèi)似:
public class RecyclerViewTestActivity extends AppCompatActivity {
private RecyclerView recyclerView_one;
private RecyclerView.Adapter mAdapter;
private LinearLayoutManager mLayoutManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//開(kāi)始設(shè)置RecyclerView
recyclerView_one=(RecyclerView)this.findViewById(R.id.recyclerView);
//設(shè)置固定大小
recyclerView_one.setHasFixedSize(true);
//創(chuàng)建線性布局
mLayoutManager = new LinearLayoutManager(this);
//垂直方向
mLayoutManager.setOrientation(OrientationHelper.VERTICAL);
//給RecyclerView設(shè)置布局管理器
recyclerView_one.setLayoutManager(mLayoutManager);
//創(chuàng)建適配器曙蒸,并且設(shè)置
mAdapter = new TestRecyclerAdapter(this);
recyclerView_one.setAdapter(mAdapter);
}
}
4捌治、自定義一個(gè)適配器來(lái)進(jìn)行創(chuàng)建item view以及綁定數(shù)據(jù)
public class TestRecyclerAdapter extends RecyclerView.Adapter<TestRecyclerAdapter.ViewHolder>{
private LayoutInflater mInflater;
private String[] mTitles=null;
public TestRecyclerAdapter(Context context){
this.mInflater=LayoutInflater.from(context);
this.mTitles=new String[20];
for (int i=0;i<20;i++){
int index=i+1;
mTitles[i]="item"+index;
}
}
/**
* item顯示類(lèi)型
* @param parent
* @param viewType
* @return
*/
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view=mInflater.inflate(R.layout.item_recycler_layout,parent,false);
//view.setBackgroundColor(Color.RED);
ViewHolder viewHolder=new ViewHolder(view);
return viewHolder;
}
/**
* 數(shù)據(jù)的綁定顯示
* @param holder
* @param position
*/
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.item_tv.setText(mTitles[position]);
}
@Override
public int getItemCount() {
return mTitles.length;
}
//自定義的ViewHolder,持有每個(gè)Item的的所有界面元素
public static class ViewHolder extends RecyclerView.ViewHolder {
public TextView item_tv;
public ViewHolder(View view){
super(view);
item_tv = (TextView)view.findViewById(R.id.item_tv);
}
}
}
這個(gè)自定義Adapter和我們?cè)谑褂肔istview時(shí)候的Adapter相比還是有點(diǎn)不太一樣的纽窟,首先這邊我們需要繼承RecyclerView.Adaper類(lèi)肖油,然后實(shí)現(xiàn)兩個(gè)重要的方法onBindViewHodler()以及onCreateViewHolder(),這邊我們看出來(lái)區(qū)別,使用RecyclerView控件我們就可以把Item View視圖創(chuàng)建和數(shù)據(jù)綁定這兩步進(jìn)行分來(lái)進(jìn)行管理臂港,用法就更加方便而且靈活了,并且我們可以定制打造千變?nèi)f化的布局森枪。同時(shí)這邊我們還需要?jiǎng)?chuàng)建一個(gè)ViewHolder類(lèi)视搏,該類(lèi)必須繼承自RecyclerView.ViewHolder類(lèi),現(xiàn)在Google也要求我們必須要實(shí)現(xiàn)ViewHolder來(lái)承載Item的視圖县袱。
-
該Demo運(yùn)行效果如下:
上面的例子我們這邊比較簡(jiǎn)單使用LinearLayoutManager來(lái)實(shí)現(xiàn)了浑娜,其中布局是采用垂直布局的,當(dāng)然我們還可以設(shè)置線性布局的方向?yàn)闄M向式散,只要如下設(shè)置即可:
mLayoutManager.setOrientation(OrientationHelper.HORIZONTAL);
運(yùn)行效果如下:
那么另外兩種內(nèi)置的布局如下:
- 1筋遭、GridLayoutManger:使用如下設(shè)置:
GridLayoutManager girdLayoutManager=new GridLayoutManager(this,4);
recyclerView_one.setLayoutManager(girdLayoutManager);
運(yùn)行效果如下:
- 2、StaggeredGridLayoutManager :使用如下設(shè)置:
StaggeredGridLayoutManager staggeredGridLayoutManager=new StaggeredGridLayoutManager(2,OrientationHelper.VERTICAL);
recyclerView_one.setLayoutManager(staggeredGridLayoutManager);
實(shí)現(xiàn)的是瀑布流的效果
四暴拄、RecyclerView分隔線實(shí)現(xiàn)(ItemDecoration):
- 大家肯定觀察到上面的顯示效果還是比較丑,例如就沒(méi)有分隔線這個(gè)效果,下面我們一起來(lái)實(shí)現(xiàn)以下分隔線的效果隆箩。還記得前面的一個(gè)表格中有寫(xiě)關(guān)于RecyclerView的相關(guān)類(lèi):
RecyclerView.ItemDecoration | 給每一項(xiàng)Item視圖添加子View,可以進(jìn)行畫(huà)分隔線之類(lèi)的東西 |
---|
我們可以創(chuàng)建一個(gè)繼承RecyclerView.ItemDecoration類(lèi)來(lái)繪制分隔線秀存,通過(guò)ItemDecoration可以讓我們每一個(gè)Item從視覺(jué)上面相互分開(kāi)來(lái),例如ListView的divider非常相似的效果撕蔼。當(dāng)然像我們上面的例子ItemDecoration我們沒(méi)有設(shè)置也沒(méi)有報(bào)錯(cuò)哦豁鲤,那說(shuō)明ItemDecoration我們并不是強(qiáng)制需要使用,作為我們開(kāi)發(fā)者可以設(shè)置或者不設(shè)置Decoration的罕邀。
實(shí)現(xiàn)一個(gè)ItemDecoration畅形,系統(tǒng)提供的ItemDecoration是一個(gè)抽象類(lèi),內(nèi)部除去已經(jīng)廢棄的方法以外诉探,我們主要實(shí)現(xiàn)以下三個(gè)方法:
public static abstract class ItemDecoration {
public void onDraw(Canvas c,RecyclerView parent, State state) {
onDraw(c, parent);
}
public void onDrawOver(Canvas c,RecyclerView parent, State state) {
onDrawOver(c, parent);
}
public void getItemOffsets(RectoutRect, View view, RecyclerView parent, State state) {
getItemOffsets(outRect,((LayoutParams) view.getLayoutParams()).getViewLayoutPosition(),
parent);
}
}
又因?yàn)楫?dāng)我們RecyclerView在進(jìn)行繪制的時(shí)候會(huì)進(jìn)行繪制Decoration,那么會(huì)去調(diào)用onDraw和onDrawOver方法日熬,那么這邊我們其實(shí)只要去重寫(xiě)onDraw和getItemOffsets這兩個(gè)方法就可以實(shí)現(xiàn)啦。然后LayoutManager會(huì)進(jìn)行Item布局的時(shí)候肾胯,回去調(diào)用getItemOffset方法來(lái)計(jì)算每個(gè)Item的Decoration合適的尺寸
下面我們來(lái)具體實(shí)現(xiàn)一個(gè)Decoration:
TestDecoration.java
public class TestDecoration extends RecyclerView.ItemDecoration {
//采用系統(tǒng)內(nèi)置的風(fēng)格的分割線
private static final int[] attrs=newint[]{android.R.attr.listDivider};
private Drawable mDivider;
public TestDecoration(Context context) {
TypedArray typedArray=context.obtainStyledAttributes(attrs);
mDivider=typedArray.getDrawable(0);
}
/**
* 進(jìn)行自定義繪制
* @param c
* @param parent
* @param state
*/
@Override
public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
int top=parent.getPaddingTop();
intbottom=parent.getHeight()-parent.getPaddingBottom();
int childCount=parent.getChildCount();
for(int i=0;i<childCount;i++){
View child=parent.getChildAt(i);
RecyclerView.LayoutParams layoutParams=(RecyclerView.LayoutParams)child.getLayoutParams();
intleft=child.getRight()+layoutParams.rightMargin;
intright=left+mDivider.getIntrinsicWidth();
mDivider.setBounds(left,top,right,bottom);
mDivider.draw(c);
}
}
@Override
public void getItemOffsets(Rect outRect,View view, RecyclerView parent, RecyclerView.State state) {
outRect.set(0,0,mDivider.getIntrinsicWidth(),0);
}
}
- 我這邊實(shí)例中采用系統(tǒng)主題(android.R.attr.listDivider)來(lái)設(shè)置成分隔線的竖席,然后來(lái)獲取尺寸,位置進(jìn)行setBound(),繪制,接著通過(guò)outRect.set()來(lái)設(shè)置繪制整個(gè)區(qū)域范圍敬肚,最后不要忘記往RecyclerView中設(shè)置該自定義的分割線:
//添加分割線
recyclerView_one.addItemDecoration(newTestDecoration(this));
-
運(yùn)行效果大致如下:
上面的分割線效果只是垂直畫(huà)了分割線毕荐,但是我們水平方向也要進(jìn)行畫(huà)分割線,那么我們下面對(duì)于自定義的Decoration進(jìn)行改進(jìn):
AdvanceDecoration.java
/**
* 當(dāng)前類(lèi)注釋:改進(jìn)之后的自定義Decoration分割線
*/
public class AdvanceDecoration extends RecyclerView.ItemDecoration{
//采用系統(tǒng)內(nèi)置的風(fēng)格的分割線
private static final int[] attrs=newint[]{android.R.attr.listDivider};
private Drawable mDivider;
private int orientation;
public AdvanceDecoration(Contextcontext,int orientation) {
TypedArray typedArray=context.obtainStyledAttributes(attrs);
mDivider=typedArray.getDrawable(0);
typedArray.recycle();
this.orientation=orientation;
}
@Override
public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
drawHDeraction(c,parent);
drawVDeraction(c,parent);
}
/**
* 繪制水平方向的分割線
* @param c
* @param parent
*/
private void drawHDeraction(Canvas c,RecyclerView parent){
int left=parent.getPaddingLeft();
intright=parent.getWidth()-parent.getPaddingRight();
int childCount=parent.getChildCount();
for(int i=0;i<childCount;i++){
View child=parent.getChildAt(i);
RecyclerView.LayoutParams layoutParams=(RecyclerView.LayoutParams)child.getLayoutParams();
inttop=child.getBottom()+layoutParams.bottomMargin;
intbottom=top+mDivider.getIntrinsicHeight();
mDivider.setBounds(left,top,right,bottom);
mDivider.draw(c);
}
}
/**
* 繪制垂直方向的分割線
* @param c
* @param parent
*/
private void drawVDeraction(Canvas c,RecyclerView parent){
int top=parent.getPaddingTop();
intbottom=parent.getHeight()-parent.getPaddingBottom();
int childCount=parent.getChildCount();
for(int i=0;i<childCount;i++){
View child=parent.getChildAt(i);
RecyclerView.LayoutParamsla youtParams=(RecyclerView.LayoutParams)child.getLayoutParams();
intleft=child.getRight()+layoutParams.rightMargin;
intright=left+mDivider.getIntrinsicWidth();
mDivider.setBounds(left,top,right,bottom);
mDivider.draw(c);
}
}
@Override
public void getItemOffsets(Rect outRect,View view, RecyclerView parent, RecyclerView.State state) {
if(OrientationHelper.HORIZONTAL==orientation){
outRect.set(0, 0,mDivider.getIntrinsicWidth(), 0);
}else {
outRect.set(0, 0, 0,mDivider.getIntrinsicHeight());
}
}
}
- 改良之后的自定義分割器的構(gòu)造函數(shù)中新增一個(gè)int參數(shù)艳馒,用來(lái)表示橫向還是縱向布局憎亚,這樣我們可以分別來(lái)繪制分割線。
- 具體使用方法:
recyclerView_one.addItemDecoration(new AdvanceDecoration(this,OrientationHelper.VERTICAL));
- 運(yùn)行比較效果如下:
橫向效果
縱向效果
五弄慰、RecyclerView高級(jí)用戶(hù)(監(jiān)聽(tīng)事件處理)
我們知道在ListView使用的時(shí)候第美,該控件給我們提供一個(gè)onItemClickListener監(jiān)聽(tīng)器,這樣當(dāng)我們的item發(fā)生觸發(fā)事件的時(shí)候陆爽,會(huì)回調(diào)相關(guān)的方法什往,以便我們方便處理Item點(diǎn)擊事件。
對(duì)于RecyclerView來(lái)講慌闭,非潮鹜可惜的時(shí)候躯舔,該控件沒(méi)有給我們提供這樣的內(nèi)置監(jiān)聽(tīng)器方法,不過(guò)我們可以進(jìn)行改造實(shí)現(xiàn)省古。我們先來(lái)看一下之前我們寫(xiě)得TestRecyclerAdapter中的onCreateViewHolder()方法中的代碼:
public ViewHolder onCreateViewHolder(ViewGroupparent, int viewType) {
Viewview=mInflater.inflate(R.layout.item_recycler_layout,parent,false);
//這邊可以做一些屬性設(shè)置粥庄,甚至事件監(jiān)聽(tīng)綁定
//view.setBackgroundColor(Color.RED);
ViewHolder viewHolder=newViewHolder(view);
return viewHolder;
}
- 該方法創(chuàng)建一個(gè)ViewHolder,其中承載的就是每一項(xiàng)Item View視圖衫樊,那么我們可以在view創(chuàng)建出來(lái)之后給它進(jìn)行添加相應(yīng)的屬性或者監(jiān)聽(tīng)方法飒赃,例如:背景顏色,大小,以及點(diǎn)擊事件。既然可以這樣解決科侈,OK载佳,我們給View添加一個(gè)onClickListener監(jiān)聽(tīng)器,然后點(diǎn)擊的時(shí)候回調(diào)onClick()方法臀栈。同時(shí)我們需要自定義一個(gè)類(lèi)似于onItemClickListener()的監(jiān)聽(tīng)器來(lái)處理蔫慧。
注意:這個(gè)監(jiān)聽(tīng)就在該adapter里定義
/**
* 自定義RecyclerView 中item view點(diǎn)擊回調(diào)方法
*/
interface OnRecyclerItemClickListener{
/**
* item view 回調(diào)方法
* @param view 被點(diǎn)擊的view
* @param position 點(diǎn)擊索引
*/
void onItemClick(View view, intposition);
}
- 然后聲明以及Adapter初始化的時(shí)候傳入進(jìn)去:
public TestRecyclerAdapter(Contextcontext,OnRecyclerItemClickListener onRecyclerItemClickListener){
……
this.onRecyclerItemClickListener=onRecyclerItemClickListener;
}
- 然后我們?cè)趏nClick回調(diào)方法中調(diào)用OnRecyclerItemClickListener接口的方法:
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(onRecyclerItemClickListener!=null){
onRecyclerItemClickListener.onItemClick(view, (int)view.getTag());
}
}
});
注意:這里的view就是onCreateViewHolder方法里返回的view,完整邏輯大致就是如下的樣子:
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
final View view=mInflater.inflate(R.layout.item_recycler_layout,parent,false);
//這邊可以做一些屬性設(shè)置权薯,甚至事件監(jiān)聽(tīng)綁定
//view.setBackgroundColor(Color.RED);
ViewHolder viewHolder=new ViewHolder(view);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(onRecyclerItemClickListener!=null){
onRecyclerItemClickListener.onItemClick(view, (int)view.getTag());
}
}
});
return viewHolder;
}
- 上面的onItemClick中第二個(gè)參數(shù)的position姑躲,采用view.getTag的方法獲取,那么我們就需要在onBindViewHolder()方法中設(shè)置一個(gè)tag了:
public voidonBindViewHolder(ViewHolder holder, int position) {
holder.item_tv.setText(mTitles[position]);
holder.itemView.setTag(position);
}
- 最后我們?cè)谕獠渴褂靡幌陆涌?
mAdapter = new TestRecyclerAdapter(this, new TestRecyclerAdapter.OnRecyclerItemClickListener() {
@Override
public void onItemClick(View view,int position) {
Toast.makeText(RecyclerViewTestActivity.this, "點(diǎn)擊了第"+position+"項(xiàng)", Toast.LENGTH_SHORT).show();
}
});
-
運(yùn)行結(jié)果大致如下:
六盟蚣、RecyclerView數(shù)據(jù)添加刪除處理
講了以上RecyclerView中各種用戶(hù)黍析,處理之后,現(xiàn)在我們來(lái)看一下當(dāng)數(shù)據(jù)發(fā)生變化之后的處理屎开。例如我們?cè)谑褂肔istView的時(shí)候阐枣,當(dāng)數(shù)據(jù)發(fā)生變化的時(shí)候可以通過(guò)notifyDatasetChange()來(lái)刷新界面。
對(duì)于RecyclerView控件來(lái)講奄抽,給我們提供更加高級(jí)的使用方法notifyItemInserted(position)和notifyItemRemoved(position)
我們可以在TestRecyclerAdapter中添加數(shù)據(jù)新增和數(shù)據(jù)刪除的方法如下:
//添加數(shù)據(jù)
public void addItem(String data, int position) {
mTitles.add(position, data);
notifyItemInserted(position);
}
//刪除數(shù)據(jù)
public void removeItem(String data) {
int position = mTitles.indexOf(data);
mTitles.remove(position);
notifyItemRemoved(position);
}
- 然后我們?cè)贏ctivity中進(jìn)行調(diào)用即可:
//添加數(shù)據(jù)
mAdapter.addItem("additem",5);
//刪除數(shù)據(jù)
mAdapter.removeItem("item4");
- 在運(yùn)行之前我們不要忘記RecyclerView給提供了動(dòng)畫(huà)設(shè)置蔼两,我這邊就直接采用了默認(rèn)動(dòng)畫(huà),設(shè)置方法如下:
//添加默認(rèn)的動(dòng)畫(huà)效果
recyclerView_one.setItemAnimator(new DefaultItemAnimator());
-
最終運(yùn)行效果大致如下圖:
七逞度、RecyclerView總結(jié)
到此為止就完成我們RecyclerView控件使用的第一講內(nèi)容额划,其中包括控件的基本介紹,基本使用档泽,高級(jí)用法(自定義間隔符,加入點(diǎn)擊監(jiān)聽(tīng)事件以及Item添加刪除動(dòng)畫(huà)處理)俊戳。總體來(lái)講RecyclerView控件是非常不錯(cuò)馆匿,尤其在布局以及數(shù)據(jù)綁定抑胎,動(dòng)畫(huà)方面,除了系統(tǒng)內(nèi)置的三種布局方式之外甜熔,我們還可以定制出我們自己的布局管理器。同時(shí)當(dāng)item數(shù)據(jù)發(fā)生變化的時(shí)候還給我們提供非常炫的效果突倍。相信大家在今天這一講之后腔稀,會(huì)越來(lái)越愛(ài)上RecyclerView控件的使用盆昙,從此可以拋棄ListView和GridView啦.
本次具體實(shí)例注釋過(guò)的全部代碼已經(jīng)上傳到FastDev4Android項(xiàng)目中了。同時(shí)歡迎大家去Github站點(diǎn)進(jìn)行clone或者下載瀏覽:
https://github.com/jiangqqlmj/FastDev4Android 同時(shí)歡迎大家star和fork整個(gè)開(kāi)源快速開(kāi)發(fā)框架項(xiàng)目~下一講我們會(huì)通過(guò)一個(gè)具體實(shí)例來(lái)自定義實(shí)現(xiàn)一個(gè)廣告條控件實(shí)例焊虏。-
本人錄制AA(Android Annotations)注入框架的視頻教程已經(jīng)上線了,歡迎大家前往觀看淡喜。http://www.cniao5.com/course/10074
再次聲明:本文轉(zhuǎn)載自:【江清清的博客】http://blog.csdn.net/developer_jiangqq/article/details/49927631**