列表是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(); } });