列表是android中很經常使用的一個功能,之前咱們的習慣作法是使用ListView,在adapter裏面經過ViewHolder能夠實現item的重用,以節省資源,提升加載效率,可是當列表頁數據龐大,須要分頁,上拉加載更多時,就會遇到一個問題,每次上拉會把全部數據從新加載一遍,而不是隻加載新獲取的數據,這個時候就須要RecylerView來代替ListView。
接下來就討論關於關於一下recylerview的幾個問題:
①RecyclerView與ListView相比它的優勢
②RecyclerView的初步用法
③RecyclerView增長分隔線
④RecyclerView更改分隔線的樣式
⑤RecyclerView的Adapter的用法
⑥RecyclerView.Adapter中刷新的幾個方法的對比
⑦給RecyclerView增長條目點擊事件java
1.RecyclerView是什麼?
RecylerView是support-v7包中的新組件,是一個強大的滑動組件,與經典的ListView相比,一樣擁有item回收複用的功能,這一點從它的名字recylerview即回收view也能夠看出。看到這也許有人會問,不是已經有ListView了嗎,爲何還要RecylerView呢?這就牽扯到第二個問題了。android
2.RecyclerView的優勢是什麼?
根據官方的介紹RecylerView是ListView的升級版,既然如此那RecylerView必然有它的優勢,現就RecylerView相對於ListView的優勢羅列以下:
①RecylerView封裝了viewholder的回收複用,也就是說RecylerView標準化了ViewHolder,編寫Adapter面向的是ViewHolder而再也不是View了,複用的 邏輯被封裝了,寫起來更加簡單。
②提供了一種插拔式的體驗,高度的解耦,異常的靈活,針對一個Item的顯示RecylerView專門抽取出了相應的類,來控制Item的顯示,使其的擴展性很是強。例如:你想控制橫向或者縱向滑動列表效果能夠經過LinearLayoutManager這個類來進行控制(與GridView效果對應的是GridLayoutManager,與瀑布流對應的還有StaggeredGridLayoutManager等),也就是說RecylerView再也不拘泥於ListView的線性展現方式,它也能夠實現GridView的效果等多種效果。你想控制Item的分隔線,能夠經過繼承RecylerView的ItemDecoration這個類,而後針對本身的業務需求去抒寫代碼。
③能夠控制Item增刪的動畫,能夠經過ItemAnimator這個類進行控制,固然針對增刪的動畫,RecylerView有其本身默認的實現。
3.RecyclerView的用法
3.1 RecyclerView的初步用法(包括RecyclerView.Adapter用法)
說了這麼多,可能你們最關心的就是RecylerView應該怎麼用,咱們先來討論討論RecylerView的用法的理論知識,而後結合一個實例來體驗一下RecylerView的優點首先咱們須要明白的一點是使用RecylerView必須導入support-v7包,在上面我提到過RecylerView高度的解耦,異常的靈活谷歌給咱們提供了多個類來控制Item的顯示。ide
recyclerView = (RecyclerView) findViewById(R.id.recyclerView); LinearLayoutManager layoutManager = new LinearLayoutManager(this ); //設置佈局管理器 recyclerView.setLayoutManager(layoutManager); //設置爲垂直佈局,這也是默認的 layoutManager.setOrientation(OrientationHelper. VERTICAL); //設置Adapter recyclerView.setAdapter( recycleAdapter); //設置分隔線 recyclerView.addItemDecoration( new DividerGridItemDecoration(this )); //設置增長或刪除條目的動畫 recyclerView.setItemAnimator( new DefaultItemAnimator());
能夠看到對RecylerView的設置過程,比ListView要複雜一些,這也是RecylerView高度解耦的表現,雖然代碼抒寫上有點複雜,但它的擴展性是極高的。
在瞭解了RecyclerView的一些控制以後,緊接着來看看它的Adapter的寫法,RecyclerView的Adapter與ListView的Adapter仍是有點區別的,RecyclerView.Adapter,須要實現3個方法:
①onCreateViewHolder()佈局
這個方法主要生成爲每一個Item inflater出一個View,可是該方法返回的是一個ViewHolder。該方法把View直接封裝在ViewHolder中,而後咱們面向的是ViewHolder這個實例,固然這個ViewHolder須要咱們本身去編寫。直接省去了當初的convertView.setTag(holder)和convertView.getTag()這些繁瑣的步驟。
②onBindViewHolder()動畫
這個方法主要用於適配渲染數據到View中。方法提供給你了一個viewHolder,而不是原來的convertView。
③getItemCount()this
這個方法就相似於BaseAdapter的getCount方法了,即總共有多少個條目。
實例:接着來幾個小的實例幫助你們更深刻的瞭解RecyclerView的用法,首先來實現一個最簡單的列表,效果以下spa
public class MainActivity extends ActionBarActivity { private RecyclerView recyclerView; private List<String> mDatas; private MyRecyclerAdapter recycleAdapter; @SuppressLint("NewApi") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout. activity_main); recyclerView = (RecyclerView) findViewById(R.id.recyclerView ); initData(); recycleAdapter= new MyRecyclerAdapter(MainActivity.this , mDatas ); LinearLayoutManager layoutManager = new LinearLayoutManager(this); //設置佈局管理器 recyclerView.setLayoutManager(layoutManager); //設置爲垂直佈局,這也是默認的 layoutManager.setOrientation(OrientationHelper.VERTICAL); //設置Adapter recyclerView.setAdapter( recycleAdapter); //設置增長或刪除條目的動畫 recyclerView.setItemAnimator(new DefaultItemAnimator()); } private void initData() { mDatas = new ArrayList<String>(); for ( int i=0; i < 40; i++) { mDatas.add( "item"+i); } } } RecyclerView的Adapter的代碼以下: public class MyRecyclerAdapter extends RecyclerView.Adapter<MyRecyclerAdapter.MyViewHolder> { private List<String> mDatas; private Context mContext; private LayoutInflater inflater; public MyRecyclerAdapter(Context context, List<String> datas){ this. mContext=context; this. mDatas=datas; inflater=LayoutInflater. from(mContext); } @Override public int getItemCount() { return mDatas.size(); } //填充onCreateViewHolder方法返回的holder中的控件 @Override public void onBindViewHolder(MyViewHolder holder, final int position) { holder.tv.setText( mDatas.get(position)); } //重寫onCreateViewHolder方法,返回一個自定義的ViewHolder @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = inflater.inflate(R.layout. item_home,parent, false); MyViewHolder holder= new MyViewHolder(view); return holder; } class MyViewHolder extends ViewHolder{ TextView tv; public MyViewHolder(View view) { super(view); tv=(TextView) view.findViewById(R.id. tv_item); } } }
能夠看到RecyclerView標準化了ViewHolder,編寫 Adapter面向的是ViewHoder而不在是View了,複用的邏輯被封裝了,寫起來更加簡單。其實它的寫法與BaseAdapter的寫法是差很少的,你們能夠對比下它與getView方法寫法的區別,在onCreateViewHolder方法中初始化了一個View,而後返回一個ViewHolder,這個返回的ViewHolder相似於以前在getView中的convertView.getTag(),而後在onBindViewHolder方法中去給這個ViewHolder中的控件填充值。其實它的原理跟getView是差很少的,只是作了封裝,咱們寫起來比較簡潔。到這裏,看到上述運行效果可能有不少人會說,這效果太醜了,連個分隔線都沒有,不要急,咱們一步一步來。.net
3.2 RecyclerView增長分隔線
前面咱們說到能夠經過RecyclerView.addItemDecoration(ItemDecoration decoration)這個方法進行設置,其中它須要的參數就是咱們本身定義的繼承自ItemDecoration的一個對象。咱們能夠建立一個繼承RecyclerView.ItemDecoration類來繪製分隔線,經過ItemDecoration可讓咱們每個Item從視覺上面相互分開來,例如ListView的divider很是類似的效果。固然像咱們上面的例子ItemDecoration咱們沒有設置也沒有報錯,那說明ItemDecoration咱們並非強制須要使用,做爲咱們開發者能夠設置或者不設置Decoration的。實現一個ItemDecoration,系統提供的ItemDecoration是一個抽象類,內部除去已經廢棄的方法之外,咱們主要實現如下三個方法:code
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); } }
又由於當咱們RecyclerView在進行繪製的時候會進行繪製Decoration,那麼會去調用onDraw和onDrawOver方法,那麼這邊咱們其實只要去重寫onDraw和getItemOffsets這兩個方法就能夠實現啦。而後LayoutManager會進行Item佈局的時候,會去調用getItemOffset方法來計算每一個Item的Decoration合適的尺寸,下面咱們來具體實現一個xml
Decoration,DividerItemDecoration.java public class DividerItemDecoration extends RecyclerView.ItemDecoration { private static final int[] ATTRS = new int[]{ android.R.attr. listDivider }; public static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL; public static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL; private Drawable mDivider; private int mOrientation; public DividerItemDecoration(Context context, int orientation) { final TypedArray a = context.obtainStyledAttributes(ATTRS ); mDivider = a.getDrawable(0); a.recycle(); setOrientation(orientation); } public void setOrientation( int orientation) { if (orientation != HORIZONTAL_LIST && orientation != VERTICAL_LIST) { throw new IllegalArgumentException( "invalid orientation"); } mOrientation = orientation; } @Override public void onDraw(Canvas c, RecyclerView parent) { if (mOrientation == VERTICAL_LIST) { drawVertical(c, parent); } else { drawHorizontal(c, parent); } } public void drawVertical(Canvas c, RecyclerView parent) { final int left = parent.getPaddingLeft(); final int right = parent.getWidth() - parent.getPaddingRight(); final int childCount = parent.getChildCount(); for (int i = 0; i < childCount; i++) { final View child = parent.getChildAt(i); final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child .getLayoutParams(); final int top = child.getBottom() + params.bottomMargin; final int bottom = top + mDivider.getIntrinsicHeight(); mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); } } public void drawHorizontal(Canvas c, RecyclerView parent) { final int top = parent.getPaddingTop(); final int bottom = parent.getHeight() - parent.getPaddingBottom(); final int childCount = parent.getChildCount(); for (int i = 0; i < childCount; i++) { final View child = parent.getChildAt(i); final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child .getLayoutParams(); final int left = child.getRight() + params.rightMargin; final int right = left + mDivider.getIntrinsicHeight(); mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); } } @Override public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) { if (mOrientation == VERTICAL_LIST) { outRect.set(0, 0, 0, mDivider.getIntrinsicHeight()); }else{ outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0); } } }
在這裏咱們採用系統主題(android.R.attr.listDivider)來設置成分隔線的,而後來獲取尺寸,位置進行setBound(),繪製,接着經過outRect.set()來設置繪製整個區域範圍,固然了它是有兩種狀況的一種LinearLayoutManager.HORIZONTAL另一種LinearLayoutManager.VERTICAL須要分別對其進行處理,最後不要忘記往RecyclerView中設置該自定義的分割線,而後在MainActivity中加上一句recyclerView
.addItemDecoration(new DividerItemDecoration(MainActivity.this,LinearLayoutManager.VERTICAL))即給RecyclerView增長分隔線。而後運行,效果以下:
以看到已經有了分隔線,跟ListView的效果基本一致了。固然了,既然谷歌給咱們提供了這個專門添加分隔線的方法,那它確定會容許咱們自定義分隔線的樣式,否則把這個方法抽取出來也沒有任何意義。
3.3 改變分隔線樣式
那麼怎麼更改分隔線的樣式呢?在上面的DividerItemDecoration這個類中能夠看到這個分隔線是跟ListView同樣的,即系統的默認的樣式,所以咱們能夠在styles的xml文件中進行更改,更改以下:
<!-- Application theme. --> <style name ="AppTheme" parent="AppBaseTheme"> <!-- All customizations that are NOT specific to a particular API-level can go here. --> <item name= "android:listDivider">@drawable/divider </item > </style >
divider的內容以下
<?xml version="1.0" encoding= "utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" > <!-- 填充的顏色 --> <solid android:color ="@color/color_red"/> <!-- 線條大小 --> <size android:height ="1dp" android:width ="1dp"/> </shape>
能夠看到分隔線的顏色變了,固然了這只是一個小例子,咱們能夠按照業務需求去更改,這樣就基本實現了ListView的效果,看到這你確定以爲還不如ListView簡單呢,從上面的代碼量看來確實是使用起來很複雜,可是若是此時你想將這個列表以GridView的形式展現出來,用RecylerView僅僅是換一行代碼的事情,
在上面的代碼中咱們使用了
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
//設置佈局管理器
recyclerView.setLayoutManager(layoutManager);
RecyclerView.LayoutManager是一個抽象類,系統爲咱們提供了三個實現類
①LinearLayoutManager即線性佈局,這個是在上面的例子中咱們用到的佈局
②GridLayoutManager即表格佈局
③StaggeredGridLayoutManager即流式佈局,如瀑布流效果
假如將上述例子換成GridView的效果,那麼相應的代碼應該這樣改
recyclerView .setLayoutManager(new GridLayoutManager( this,4));
除此以外上述的分隔線也要作相應的更改,由於在上述DividerItemDecoration這個方法中從
final int left = parent.getPaddingLeft();
final int right = parent.getWidth() - parent.getPaddingRight();
這兩行咱們能夠看出來,它是繪製了一條線這條線就是從RecyclerView去掉左右邊距後,剩餘的部分,由於當顯示成ListView時每一行就一個Item因此總體效果看上去就跟ListView差很少,而當展現成GridView那樣的效果時,每一行就不止一個條目了,而有多是多個,因此這個類就再也不適用了,咱們須要從新寫一個,這裏我就直接用鴻洋大神寫的了,它的博客地址:http://blog.csdn.net/lmj62356...
public class DividerGridItemDecoration extends RecyclerView.ItemDecoration { private static final int[] ATTRS = new int[] { android.R.attr.listDivider }; private Drawable mDivider; public DividerGridItemDecoration(Context context) { final TypedArray a = context.obtainStyledAttributes(ATTRS ); mDivider = a.getDrawable(0); a.recycle(); } @Override public void onDraw(Canvas c, RecyclerView parent, State state) { drawHorizontal(c, parent); drawVertical(c, parent); } private int getSpanCount(RecyclerView parent) { // 列數 int spanCount = -1; LayoutManager layoutManager = parent.getLayoutManager(); if (layoutManager instanceof GridLayoutManager) { spanCount = ((GridLayoutManager) layoutManager).getSpanCount(); } else if (layoutManager instanceof StaggeredGridLayoutManager) { spanCount = ((StaggeredGridLayoutManager) layoutManager) .getSpanCount(); } return spanCount; } public void drawHorizontal(Canvas c, RecyclerView parent) { int childCount = parent.getChildCount(); for ( int i = 0; i < childCount; i++) { final View child = parent.getChildAt(i); final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child .getLayoutParams(); final int left = child.getLeft() - params.leftMargin; final int right = child.getRight() + params.rightMargin + mDivider.getIntrinsicWidth(); final int top = child.getBottom() + params.bottomMargin; final int bottom = top + mDivider.getIntrinsicHeight(); mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); } } public void drawVertical(Canvas c, RecyclerView parent) { final int childCount = parent.getChildCount(); for ( int i = 0; i < childCount; i++) { final View child = parent.getChildAt(i); final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child .getLayoutParams(); final int top = child.getTop() - params.topMargin; final int bottom = child.getBottom() + params.bottomMargin; final int left = child.getRight() + params.rightMargin; final int right = left + mDivider.getIntrinsicWidth(); mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); } } private boolean isLastColum(RecyclerView parent, int pos, int spanCount, int childCount) { LayoutManager layoutManager = parent.getLayoutManager(); if (layoutManager instanceof GridLayoutManager) { if ((pos + 1) % spanCount == 0) // 若是是最後一列,則不須要繪製右邊 { return true; } } else if (layoutManager instanceof StaggeredGridLayoutManager) { int orientation = ((StaggeredGridLayoutManager) layoutManager) .getOrientation(); if (orientation == StaggeredGridLayoutManager.VERTICAL ) { if ((pos + 1) % spanCount == 0) // 若是是最後一列,則不須要繪製右邊 { return true; } } else { childCount = childCount - childCount % spanCount; if (pos >= childCount) // 若是是最後一列,則不須要繪製右邊 return true; } } return false; } private boolean isLastRaw(RecyclerView parent, int pos, int spanCount, int childCount) { LayoutManager layoutManager = parent.getLayoutManager(); if (layoutManager instanceof GridLayoutManager) { childCount = childCount - childCount % spanCount; if (pos >= childCount) // 若是是最後一行,則不須要繪製底部 return true; } else if (layoutManager instanceof StaggeredGridLayoutManager) { int orientation = ((StaggeredGridLayoutManager) layoutManager) .getOrientation(); // StaggeredGridLayoutManager 且縱向滾動 if (orientation == StaggeredGridLayoutManager.VERTICAL ) { childCount = childCount - childCount % spanCount; // 若是是最後一行,則不須要繪製底部 if (pos >= childCount) return true; } else // StaggeredGridLayoutManager 且橫向滾動 { // 若是是最後一行,則不須要繪製底部 if ((pos + 1) % spanCount == 0) { return true; } } } return false; } @Override public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) { int spanCount = getSpanCount(parent); int childCount = parent.getAdapter().getItemCount(); if (isLastRaw(parent, itemPosition, spanCount, childCount))// 若是是最後一行,則不須要繪製底部 { outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0); } else if (isLastColum(parent, itemPosition, spanCount, childCount))// 若是是最後一列,則不須要繪製右邊 { outRect.set(0, 0, 0, mDivider.getIntrinsicHeight()); } else { outRect.set(0, 0, mDivider.getIntrinsicWidth(), mDivider.getIntrinsicHeight()); } } }
別忘了更改分隔線recyclerView .addItemDecoration(new DividerGridItemDecoration(this ));
以看到若是你準備好了分隔線的這個類,從ListView效果到GridView效果,只須要幾行代碼,將上述代碼作以下更改
[java] view plain copy 在CODE上查看代碼片派生到個人代碼片
StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(4,StaggeredGridLayoutManager.HORIZONTAL);
//設置佈局管理器
recyclerView.setLayoutManager(layoutManager);
這裏須要注意的是StaggeredGridLayoutManager構造的第二個參數傳一個orientation,若是傳入的是StaggeredGridLayoutManager.VERTICAL那麼前面那個參數就表明有多少列;若是傳是StaggeredGridLayoutManager.HORIZONTAL那麼前面那個參數就表明有多少行
3.4 RecyclerView增長和刪除的動畫(包括RecyclerView.Adapter中刷新的幾個方法的對比)
在上面也提到了控制RecyclerView增長和刪除的動畫是經過ItemAnimator這個類來實現的,ItemAnimator這類也是個抽象的類,系統默認給咱們提供了一種增長和刪除的動畫,下面咱們就來看看這種動畫的效果,咱們須要作的修改以下:
[java] view plain copy 在CODE上查看代碼片派生到個人代碼片
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
//設置佈局管理器
recyclerView.setLayoutManager(layoutManager);
//設置增長或刪除條目的動畫
recyclerView.setItemAnimator( new DefaultItemAnimator());
而後重寫ActionBar的
[java] view plain copy 在CODE上查看代碼片派生到個人代碼片
@Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu. main, menu); return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id. id_action_add: recycleAdapter.addData(1); break; case R.id. id_action_delete: recycleAdapter.removeData(1); break; } return true; }
關於R.menu. main中的main.xml這個文件代碼就不貼了
recyclerViewAdapter中增長的兩個方法: public void addData( int position) { mDatas.add(position, "Insert One"); notifyItemInserted(position); notifyItemRangeChanged(position, mDatas.size()); } public void removeData( int position) { mDatas.remove(position); notifyItemRemoved(position); notifyItemRangeChanged(position, mDatas.size()); }
這裏須要說一下RecyclerView.Adapter中刷新數據的幾個方法,一共有這麼幾個方法
public final void notifyDataSetChanged()
public final void notifyItemChanged(int position)
public final void notifyItemRangeChanged(int positionStart, int itemCount)
public final void notifyItemInserted(int position)
public final void notifyItemMoved(int fromPosition, int toPosition)
public final void notifyItemRangeInserted(int positionStart, int itemCount)
public final void notifyItemRemoved(int position)
public final void notifyItemRangeRemoved(int positionStart, int itemCount)
notifyDataSetChanged()這個方法跟咱們平時用到的ListView的Adapter的方法同樣,這裏就很少作描述了。
notifyItemChanged(int position),當position位置的數據發生了改變時就會調用這個方法,就會回調對應position的onBindViewHolder()方法了,固然,由於ViewHolder是複用的,因此若是position在當前屏幕之外,也就不會回調了,由於沒有意義,下次position滾動會當前屏幕之內的時候一樣會調用onBindViewHolder()方法刷新數據了。其餘的方法也是一樣的道理。public
final void notifyItemRangeChanged(int positionStart, int itemCount),顧名思義,能夠刷新從positionStart開始itemCount數量的item了(這裏的刷新指回調onBindViewHolder()方法)。
public final void notifyItemInserted(int position),這個方法是在第position位置被插入了一條數據的時候可使用這個方法刷新,注意這個方法調用後會有插入的動畫,這個動畫可使用默認的,也能夠本身定義。
public final void notifyItemMoved(int fromPosition, int toPosition),這個方法是從fromPosition移動到toPosition爲止的時候可使用這個方法刷新
public final void notifyItemRangeInserted(int positionStart, int itemCount),顯然是批量添加。
public final void notifyItemRemoved(int position),第position個被刪除的時候刷新,一樣會有動畫。
將上述更改運行,點擊添加和刪除按鈕效果圖以下:
public final void notifyItemRangeRemoved(int positionStart, int itemCount),批量刪除。
3.5 給RecyclerView的Item添加點擊事件
到這裏還有一點從文章開頭到如今咱們都沒有說起,就是Item的點擊事件RecyclerView監聽事件處理在ListView使用的時候,該控件給咱們提供一個onItemClickListener監聽器,這樣當咱們點擊Item的時候,會回調相關的方法,以便咱們方便處理Item點擊事件。對於RecyclerView來說,很是惋惜的是,該控件沒有給咱們提供這樣的內置監聽器方法,不過咱們能夠進行改造實現,能夠這樣實現Item的點擊事件的監聽,在咱們的adapter中增長這兩個方法
public interface OnItemClickListener{ void onClick( int position); void onLongClick( int position); } public void setOnItemClickListener(OnItemClickListener onItemClickListener ){ this. mOnItemClickListener=onItemClickListener; }
而後onBindViewHolder方法要作以下更改
@Override public void onBindViewHolder(MyViewHolder holder, final int position) { holder. tv.setText( mDatas.get(position)); if( mOnItemClickListener!= null){ holder. itemView.setOnClickListener( new OnClickListener() { @Override public void onClick(View v) { mOnItemClickListener.onClick(position); } }); holder. itemView.setOnLongClickListener( new OnLongClickListener() { @Override public boolean onLongClick(View v) { mOnItemClickListener.onLongClick(position); return false; } }); } }<span style="color:#333333;"> </span> 在MainAcitivity中增長 [java] view plain copy 在CODE上查看代碼片派生到個人代碼片 recycleAdapter.setOnItemClickListener(new OnItemClickListener() { @Override public void onLongClick(int position) { Toast.makeText(MainActivity.this,"onLongClick事件 您點擊了第:"+position+"個Item",0).show(); } @Override public void onClick(int position) { Toast.makeText(MainActivity.this,"onClick事件 您點擊了第:"+position+"個Item",0).show(); } });