最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

RecyclerView使用詳解

 更新時(shí)間:2017年01月06日 09:26:39   作者:Android開(kāi)發(fā)666  
本文主要對(duì)RecyclerView的使用進(jìn)行了詳細(xì)介紹,文章結(jié)尾附上源碼下載,具有一定的參考價(jià)值,下面跟著小編一起來(lái)看下吧

RecylerView介紹

RecylerView是support-v7包中的新組件,是一個(gè)強(qiáng)大的滑動(dòng)組件,與經(jīng)典的ListView相比,同樣擁有item回收復(fù)用的功能,這一點(diǎn)從它的名字recylerview即回收view也可以看出。官方對(duì)于它的介紹則是:RecyclerView 是 ListView 的升級(jí)版本,更加先進(jìn)和靈活。RecyclerView通過(guò)設(shè)置LayoutManager,ItemDecoration,ItemAnimator實(shí)現(xiàn)你想要的效果。

  • 使用LayoutManager來(lái)確定每一個(gè)item的排列方式。
  • 使用ItemDecoration自己繪制分割線,更靈活
  • 使用ItemAnimator為增加或刪除一行設(shè)置動(dòng)畫(huà)效果。

注意

新建完項(xiàng)目,需要在app/build.gradle增加RecylerView依賴(lài),不然找不到RecyclerView類(lèi)

compile 'com.android.support:recyclerview-v7:23.1.0'

RecylerView簡(jiǎn)單的Demo

我們來(lái)看activity代碼,跟ListView寫(xiě)法差不多,只是這邊多設(shè)置了布局管理器。

public class LinearLayoutActivity extends AppCompatActivity {
 private RecyclerView recyclerView;
 private RecyclerViewAdapter adapter;
 private List<String> datas;
 @Override
 public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.recycler_main);
 initData();
 recyclerView= (RecyclerView) findViewById(R.id.recyclerview);
 recyclerView.setLayoutManager(new LinearLayoutManager(this));//設(shè)置布局管理器
 recyclerView.addItemDecoration(new DividerItemDecoration(this));
 recyclerView.setAdapter(adapter=new RecyclerViewAdapter(this,datas));
 }
 private void initData(){
 datas=new ArrayList<>();
 for(int i=0;i<100;i++){
  datas.add("item:"+i);
 }
 }
}

activity對(duì)應(yīng)的布局文件:recycler_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="match_parent">
 <android.support.v7.widget.RecyclerView
 android:id="@+id/recyclerview"
 android:layout_width="match_parent"
 android:layout_height="match_parent" />
</RelativeLayout>

adapter相對(duì)ListView來(lái)說(shuō)變化比較大的。把ViewHolder邏輯封裝起來(lái)了,代碼相對(duì)簡(jiǎn)單一些。

  • 需要繼承RecyclerView.Adapter,重寫(xiě)三個(gè)方法
  • MyViewHolder需要繼承RecyclerView.ViewHolder
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.MyViewHolder>{
private List<String> datas;
private LayoutInflater inflater;
public RecyclerViewAdapter(Context context,List<String> datas){
 inflater=LayoutInflater.from(context);
 this.datas=datas;
}
//創(chuàng)建每一行的View 用RecyclerView.ViewHolder包裝
@Override
public RecyclerViewAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
 View itemView=inflater.inflate(R.layout.recycler_item,null);
 return new MyViewHolder(itemView);
}
//給每一行View填充數(shù)據(jù)
@Override
public void onBindViewHolder(RecyclerViewAdapter.MyViewHolder holder, int position) {
 holder.textview.setText(datas.get(position));
}
//數(shù)據(jù)源的數(shù)量
@Override
public int getItemCount() {
 return datas.size();
}
class MyViewHolder extends RecyclerView.ViewHolder{
 private TextView textview;

 public MyViewHolder(View itemView) {
 super(itemView);
 textview= (TextView) itemView.findViewById(R.id.textview);
 }
}
}

我們來(lái)看看效果圖:

 

RecyclerView增加分隔線

RecyclerView是沒(méi)有android:divider跟android:dividerHeight屬性的,如果我們需要分割線,就只能自己動(dòng)手去實(shí)現(xiàn)了。

  • 需要繼承ItemDecoration類(lèi),實(shí)現(xiàn)onDraw跟getItemOffsets方法。
  • 調(diào)用RecyclerView的addItemDecoration方法。

我們先寫(xiě)一個(gè)DividerItemDecoration類(lèi),繼承RecyclerView.ItemDecoration,在getItemOffsets留出item之間的間隔,然后就會(huì)調(diào)用onDraw方法繪制(onDraw的繪制優(yōu)先于每一行的繪制)

public class DividerItemDecoration extends RecyclerView.ItemDecoration{
 /*
 * RecyclerView的布局方向,默認(rèn)先賦值 為縱向布局
 * RecyclerView 布局可橫向,也可縱向
 * 橫向和縱向?qū)?yīng)的分割線畫(huà)法不一樣
 * */
 private int mOrientation = LinearLayoutManager.VERTICAL;
 private int mItemSize = 1;//item之間分割線的size,默認(rèn)為1
 private Paint mPaint;//繪制item分割線的畫(huà)筆,和設(shè)置其屬性
 public DividerItemDecoration(Context context) {
 this(context,LinearLayoutManager.VERTICAL,R.color.colorAccent);
 }
 public DividerItemDecoration(Context context, int orientation) {
 this(context,orientation, R.color.colorAccent);
 }
 public DividerItemDecoration(Context context, int orientation, int dividerColor){
 this(context,orientation,dividerColor,1);
 }
 /**
 * @param context
 * @param orientation 繪制方向
 * @param dividerColor 分割線顏色 顏色資源id
 * @param mItemSize 分割線寬度 傳入dp值就行
 */
 public DividerItemDecoration(Context context, int orientation, int dividerColor, int mItemSize){
 this.mOrientation = orientation;
 if(orientation != LinearLayoutManager.VERTICAL && orientation != LinearLayoutManager.HORIZONTAL){
  throw new IllegalArgumentException("請(qǐng)傳入正確的參數(shù)") ;
 }
 //把dp值換算成px
 this.mItemSize = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,mItemSize,context.getResources().getDisplayMetrics());
 mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
 mPaint.setColor(context.getResources().getColor(dividerColor));
 }
 @Override
 public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
 if(mOrientation == LinearLayoutManager.VERTICAL){
  drawVertical(c,parent) ;
 }else {
  drawHorizontal(c,parent) ;
 }
 }
 /**
 * 繪制縱向 item 分割線
 * @param canvas
 * @param parent
 */
 private void drawVertical(Canvas canvas,RecyclerView parent){
 final int left = parent.getPaddingLeft() ;
 final int right = parent.getMeasuredWidth() - parent.getPaddingRight();
 final int childSize = parent.getChildCount() ;
 for(int i = 0 ; i < childSize ; i ++){
  final View child = parent.getChildAt( i ) ;
  RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) child.getLayoutParams();
  final int top = child.getBottom() + layoutParams.bottomMargin ;
  final int bottom = top + mItemSize ;
  canvas.drawRect(left,top,right,bottom,mPaint);
 }
 }
 /**
 * 繪制橫向 item 分割線
 * @param canvas
 * @param parent
 */
 private void drawHorizontal(Canvas canvas,RecyclerView parent){
 final int top = parent.getPaddingTop() ;
 final int bottom = parent.getMeasuredHeight() - parent.getPaddingBottom() ;
 final int childSize = parent.getChildCount() ;
 for(int i = 0 ; i < childSize ; i ++){
  final View child = parent.getChildAt( i ) ;
  RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) child.getLayoutParams();
  final int left = child.getRight() + layoutParams.rightMargin ;
  final int right = left + mItemSize ;
  canvas.drawRect(left,top,right,bottom,mPaint);
 }
 }
 /**
 * 設(shè)置item分割線的size
 * @param outRect
 * @param view
 * @param parent
 * @param state
 */
 @Override
 public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
 if(mOrientation == LinearLayoutManager.VERTICAL){
  outRect.set(0,0,0,mItemSize);//垂直排列 底部偏移
 }else {
  outRect.set(0,0,mItemSize,0);//水平排列 右邊偏移
 }
 }
}

不要忘記調(diào)用addItemDecoration方法哦

recyclerView.addItemDecoration(new DividerItemDecoration(this));//添加分割線

重新運(yùn)行,效果圖:

大家讀到這里肯定會(huì)有一個(gè)疑問(wèn),這貨比ListView麻煩多了啊,但是google官方為什么要說(shuō)是ListView的升級(jí)版呢?接下來(lái)開(kāi)始放大招。。。

GridLayoutManager

在RecyclerView中實(shí)現(xiàn)不同的列表,只需要切換不同的LayoutManager即可。RecyclerView.LayoutManager跟RecyclerView.ItemDecoration一樣,都是RecyclerView靜態(tài)抽象內(nèi)部類(lèi),但是LayoutManager有三個(gè)官方寫(xiě)好的實(shí)現(xiàn)類(lèi)。

  • LinearLayoutManager 線性布局管理器 跟ListView功能相似
  • GridLayoutManager 網(wǎng)格布局管理器 跟GridView功能相似
  • StaggeredGridLayoutManager 瀑布流布局管理器

剛剛我們用的是LinearLayoutManager,現(xiàn)在我們切換到GridLayoutManager,看到下面這句代碼,有沒(méi)有感覺(jué)分分鐘切換不同列表顯示。

recyclerView.setLayoutManager(new GridLayoutManager(this,2));

如果要顯示多列或者要縱向顯示就new不同的構(gòu)造方法,以下代碼縱向顯示4列。當(dāng)前如果你還需要反方向顯示,把false改成true就可以。

recyclerView.setLayoutManager(new GridLayoutManager(this,4,GridLayoutManager.HORIZONTAL,false));

因?yàn)橛玫氖蔷W(wǎng)格布局,所以呢繪制分割線的代碼需要重新修改一下。網(wǎng)格布局一行可以有多列,并且最后一列跟最后一行不需要繪制,所以我們得重新創(chuàng)建一個(gè)類(lèi)。

DividerGridItemDecoration.java

public class DividerGridItemDecoration extends RecyclerView.ItemDecoration {
 /*
 * RecyclerView的布局方向,默認(rèn)先賦值 為縱向布局
 * RecyclerView 布局可橫向,也可縱向
 * 橫向和縱向?qū)?yīng)的分割線畫(huà)法不一樣
 * */
 private int mOrientation = LinearLayoutManager.VERTICAL;
 private int mItemSize = 1;//item之間分割線的size,默認(rèn)為1
 private Paint mPaint;//繪制item分割線的畫(huà)筆,和設(shè)置其屬性
 public DividerGridItemDecoration(Context context) {
 this(context,LinearLayoutManager.VERTICAL,R.color.colorAccent);
 }
 public DividerGridItemDecoration(Context context, int orientation) {
 this(context,orientation, R.color.colorAccent);
 }
 public DividerGridItemDecoration(Context context, int orientation, int dividerColor){
 this(context,orientation,dividerColor,1);
 }
 /**
 * @param context
 * @param orientation 繪制方向
 * @param dividerColor 分割線顏色 顏色資源id
 * @param mItemSize 分割線寬度 傳入dp值就行
 */
 public DividerGridItemDecoration(Context context, int orientation, int dividerColor, int mItemSize){
 this.mOrientation = orientation;
 if(orientation != LinearLayoutManager.VERTICAL && orientation != LinearLayoutManager.HORIZONTAL){
  throw new IllegalArgumentException("請(qǐng)傳入正確的參數(shù)") ;
 }
 //把dp值換算成px
 this.mItemSize = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,mItemSize,context.getResources().getDisplayMetrics());
 mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
 mPaint.setColor(context.getResources().getColor(dividerColor));
 }
 @Override
 public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
 drawHorizontal(c, parent);
 drawVertical(c, parent);
 }
 private int getSpanCount(RecyclerView parent) {
 // 列數(shù)
 int spanCount = -1;
 RecyclerView.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 canvas, 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 + mItemSize;
  final int top = child.getBottom() + params.bottomMargin;
  final int bottom = top + mItemSize;
  canvas.drawRect(left,top,right,bottom,mPaint);
 }
 }
 public void drawVertical(Canvas canvas, 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 + mItemSize;
  canvas.drawRect(left,top,right,bottom,mPaint);
 }
 }
 @Override
 public void getItemOffsets(Rect outRect, int itemPosition,RecyclerView parent) {
 int spanCount = getSpanCount(parent);
 int childCount = parent.getAdapter().getItemCount();
 if (isLastRow(parent, itemPosition, spanCount, childCount)){//如果是最后一行,不需要繪制底部
  outRect.set(0, 0, mItemSize, 0);
 } else if (isLastColum(parent, itemPosition, spanCount, childCount)){// 如果是最后一列,不需要繪制右邊
  outRect.set(0, 0, 0, mItemSize);
 } else {
  outRect.set(0, 0, mItemSize,mItemSize);
 }
 }
 private boolean isLastColum(RecyclerView parent, int pos, int spanCount, int childCount) {
 RecyclerView.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 isLastRow(RecyclerView parent, int pos, int spanCount, int childCount) {
 RecyclerView.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();
  if (orientation == StaggeredGridLayoutManager.VERTICAL){//縱向
  childCount = childCount - childCount % spanCount;
  if (pos >= childCount)//最后一行
   return true;
  } else{ //橫向
  if ((pos + 1) % spanCount == 0) {//是最后一行
   return true;
  }
  }
 }
 return false;
 }
}

寫(xiě)了這兩個(gè)畫(huà)分割線的類(lèi),主流的布局:線性列表跟網(wǎng)格列表都能展示了。。。趕緊運(yùn)行代碼看看結(jié)果:

 

StaggeredGridLayoutManager

actviity中修改下布局管理器,大家應(yīng)該感覺(jué)很熟悉了吧~~~

recyclerView.setLayoutManager(new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL));

瀑布流列表一般列的高度是不一致的,為了模擬不同的寬高,數(shù)據(jù)源我把String類(lèi)型改成了對(duì)象.然后初始化的時(shí)候隨機(jī)了一個(gè)高度.

public class ItemData {
 private String content;//item內(nèi)容
 private int height;//item高度
 public ItemData() {
 }
 public ItemData(String content, int height) {
 this.content = content;
 this.height = height;
 }
 public String getContent() {
 return content;
 }
 public void setContent(String content) {
 this.content = content;
 }
 public int getHeight() {
 return height;
 }
 public void setHeight(int height) {
 this.height = height;
 }
}

瀑布流列表沒(méi)有添加分割線,給item布局設(shè)置了android:padding屬性。recycler_staggered_item.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:padding="5dp"
 android:layout_width="wrap_content"
 android:layout_height="match_parent">
 <TextView
 android:id="@+id/textview"
 android:background="@color/colorAccent"
 android:layout_width="100dp"
 android:layout_height="wrap_content"
 android:gravity="center"
 android:text="122"
 android:textSize="20sp"/>
</FrameLayout>

最后我們?cè)谶m配器的onBindViewHolder方法中給itemd中的TextView設(shè)置一個(gè)高度

@Override
public void onBindViewHolder(StaggeredGridAdapter.MyViewHolder holder, int position) {
 ItemData itemData=datas.get(position);
 holder.textview.setText(itemData.getContent());
 //手動(dòng)更改高度,不同位置的高度有所不同
 holder.textview.setHeight(itemData.getHeight());
}

是不是感覺(jué)so easy,趕緊運(yùn)行看看效果:

添加header跟footer

RecyclerView添加頭部跟底部是沒(méi)有對(duì)應(yīng)的api的,但是我們很多的需求都會(huì)用到,于是只能自己想辦法實(shí)現(xiàn)了。我們可以通過(guò)適配器的getItemViewType方法來(lái)實(shí)現(xiàn)這個(gè)功能。

修改后的適配器代碼:RecyclerHeadFootViewAdapter.java

public class RecyclerHeadFootViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{
 private List<String> datas;
 private LayoutInflater inflater;
 public static final int TYPE_HEADER=1;//header類(lèi)型
 public static final int TYPE_FOOTER=2;//footer類(lèi)型
 private View header=null;//頭View
 private View footer=null;//腳View
 public RecyclerHeadFootViewAdapter(Context context, List<String> datas){
 inflater=LayoutInflater.from(context);
 this.datas=datas;
 }
 //創(chuàng)建每一行的View 用RecyclerView.ViewHolder包裝
 @Override
 public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
 if(viewType==TYPE_HEADER){
  return new RecyclerView.ViewHolder(header){};
 }else if(viewType==TYPE_FOOTER){
  return new RecyclerView.ViewHolder(footer){};
 }
 View itemView=inflater.inflate(R.layout.recycler_item,null);
 return new MyViewHolder(itemView);
 }
 //給每一行View填充數(shù)據(jù)
 @Override
 public void onBindViewHolder(RecyclerView.ViewHolder holder, int position){
 if(getItemViewType(position)==TYPE_HEADER||getItemViewType(position)==TYPE_FOOTER){
  return;
 }
 MyViewHolder myholder= (MyViewHolder) holder;
 myholder.textview.setText(datas.get(getRealPosition(position)));
 }
 //如果有頭部 position的位置是從1開(kāi)始的 所以需要-1
 public int getRealPosition(int position){
 return header==null?position:position-1;
 }
 //數(shù)據(jù)源的數(shù)量
 @Override
 public int getItemCount() {
 if(header == null && footer == null){//沒(méi)有head跟foot
  return datas.size();
 }else if(header == null && footer != null){//head為空&&foot不為空
  return datas.size() + 1;
 }else if (header != null && footer == null){//head不為空&&foot為空
  return datas.size() + 1;
 }else {
  return datas.size() + 2;//head不為空&&foot不為空
 }
 }
 @Override
 public int getItemViewType(int position){
 //如果頭布局不為空&&位置是第一個(gè)那就是head類(lèi)型
 if(header!=null&&position==0){
  return TYPE_HEADER;
 }else if(footer!=null&&position==getItemCount()-1){//如果footer不為空&&最后一個(gè)
  return TYPE_FOOTER;
 }
 return super.getItemViewType(position);
 }
 public void setHeader(View header) {
 this.header = header;

 notifyItemInserted(0);//在位置0插入一條數(shù)據(jù),然后刷新
 }
 public void setFooter(View footer) {
 this.footer = footer;
 notifyItemInserted(datas.size()-1);//在尾部插入一條數(shù)據(jù),然后刷新
 }
 class MyViewHolder extends RecyclerView.ViewHolder{
 private TextView textview;

 public MyViewHolder(View itemView) {
  super(itemView);
  textview= (TextView) itemView.findViewById(R.id.textview);
 }
 }
}

getItemCount

有header跟footer的時(shí)候需要在源數(shù)據(jù)長(zhǎng)度基礎(chǔ)上進(jìn)行增加。

getItemViewType

通過(guò)getItemViewType判斷不同的類(lèi)型

onCreateViewHolder

通過(guò)不同的類(lèi)型創(chuàng)建item的View

onBindViewHolder

如果是header跟footer類(lèi)型是不需要綁定數(shù)據(jù)的,header跟footer的View一般在actvity中創(chuàng)建,不需要這邊做處理,所以這兩種類(lèi)型我們就不往下執(zhí)行,如果有頭布局,position==0的位置被header占用了,但是我們的數(shù)據(jù)源也就是集合的下標(biāo)是從0開(kāi)始的,所以這里需要-1。

setHeader

設(shè)置頭布局,在第一行插入一條數(shù)據(jù),然后刷新。注意這個(gè)方法調(diào)用后會(huì)有插入的動(dòng)畫(huà),這個(gè)動(dòng)畫(huà)可以使用默認(rèn)的,也可以自己定義

setFooter

設(shè)置尾部布局,在尾部插入一條數(shù)據(jù),然后刷新。

添加header跟footer的方法終于封裝好了,在activity中只需要兩行代碼就能添加header,跟ListView調(diào)用addHeader方法一樣簡(jiǎn)單,又可以happy的玩耍了。這里需要注意的是我們初始化View的時(shí)候,inflate方法需要三個(gè)參數(shù)。

  • resource 資源id
  • root 父View
  • attachToRoot true:返回父View false:返回資源id生成的View
//添加header
View header=LayoutInflater.from(this).inflate(R.layout.recycler_header,recyclerView,false);
adapter.setHeader(header);
//添加footer
View footer=LayoutInflater.from(this).inflate(R.layout.recycler_footer,recyclerView,false);
adapter.setFooter(footer);

recycler_header跟recycler_footer布局文件我就不貼出來(lái)了,就一個(gè)TextView,我們直接看效果圖:

item點(diǎn)擊事件&&增加或刪除帶動(dòng)畫(huà)效果

當(dāng)我們調(diào)用RecyclerView的setOnItemClickListener方法的時(shí)候,發(fā)現(xiàn)居然沒(méi)有,用了RecyclerView你要習(xí)慣什么東西都自己封裝。。。

首先我們從adapter開(kāi)刀,內(nèi)部寫(xiě)一個(gè)接口,一個(gè)實(shí)例變量,提供一個(gè)公共方法,設(shè)置監(jiān)聽(tīng)。

private RecyclerViewItemClick recyclerViewItemClick;
public void setRecyclerViewItemClick(RecyclerViewItemClick recyclerViewItemClick) {
 this.recyclerViewItemClick = recyclerViewItemClick;
}
public interface RecyclerViewItemClick{
 /**
 * item點(diǎn)擊
 * @param realPosition 數(shù)據(jù)源position
 * @param position view position
 */
 void onItemClick(int realPosition,int position);
}

在onBindViewHolder方法中給item監(jiān)聽(tīng)點(diǎn)擊事件

if(recyclerViewItemClick!=null) {
 myholder.itemView.setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(View v) {
  recyclerViewItemClick.onItemClick(getRealPosition(position),position);
 }
 });
}

在activity的onCreate方法中進(jìn)行監(jiān)聽(tīng),順便設(shè)置item增加刪除動(dòng)畫(huà)。我用的是sdk自帶的默認(rèn)動(dòng)畫(huà)。

adapter.setRecyclerViewItemClick(recyclerViewItemClick);
recyclerView.setItemAnimator(new DefaultItemAnimator());
private RecyclerHeadFootViewAdapter.RecyclerViewItemClick recyclerViewItemClick=new RecyclerHeadFootViewAdapter.RecyclerViewItemClick() {
 @Override
 public void onItemClick(int realPosition, int position) {
 Log.i("ansen","刪除數(shù)據(jù):"+realPosition+" view位置:"+position);
 Log.i("ansen","當(dāng)前位置:"+position+" 更新item數(shù)量:"+(adapter.getItemCount()-position-1));
 datas.remove(realPosition);//刪除數(shù)據(jù)源
 adapter.notifyItemRemoved(position);//item移除動(dòng)畫(huà)
 //更新position至adapter.getItemCount()-1的數(shù)據(jù)
 adapter.notifyItemRangeChanged(position,adapter.getItemCount()-position-1);
 }
};

源碼下載

RecyclerView

以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,同時(shí)也希望多多支持腳本之家!

相關(guān)文章

  • 關(guān)于AndroidStudio R文件莫名其妙缺失的快速解決方法

    關(guān)于AndroidStudio R文件莫名其妙缺失的快速解決方法

    下面小編就為大家?guī)?lái)一篇關(guān)于AndroidStudio R文件莫名其妙缺失的快速解決方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-03-03
  • Android BottomNavigationView與Fragment重建與重疊問(wèn)題解決方法探索

    Android BottomNavigationView與Fragment重建與重疊問(wèn)題解決方法探索

    這篇文章主要介紹了Android BottomNavigationView與Fragment重建與重疊問(wèn)題解決,總的來(lái)說(shuō)這并不是一道難題,那為什么要拿出這道題介紹?拿出這道題真正想要傳達(dá)的是解題的思路,以及不斷優(yōu)化探尋最優(yōu)解的過(guò)程。希望通過(guò)這道題能給你帶來(lái)一種解題優(yōu)化的思路
    2023-01-01
  • Android手機(jī)管理工具類(lèi)詳解

    Android手機(jī)管理工具類(lèi)詳解

    這篇文章主要為大家詳細(xì)介紹了Android手機(jī)管理工具類(lèi),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • Android開(kāi)發(fā)筆記之Android中數(shù)據(jù)的存儲(chǔ)方式(二)

    Android開(kāi)發(fā)筆記之Android中數(shù)據(jù)的存儲(chǔ)方式(二)

    我們?cè)趯?shí)際開(kāi)發(fā)中,有的時(shí)候需要儲(chǔ)存或者備份比較復(fù)雜的數(shù)據(jù)。這些數(shù)據(jù)的特點(diǎn)是,內(nèi)容多、結(jié)構(gòu)大,比如短信備份等,通過(guò)本文給大家介紹Android開(kāi)發(fā)筆記之Android中數(shù)據(jù)的存儲(chǔ)方式(二),對(duì)android數(shù)據(jù)存儲(chǔ)方式相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧
    2016-01-01
  • Android?使用壓縮紋理的方案

    Android?使用壓縮紋理的方案

    這篇文章主要介紹了Android?使用壓縮紋理,本文介紹了什么是壓縮紋理,以及加載壓縮紋理的核心步驟,并在 Android OpenGLES 平臺(tái)上實(shí)現(xiàn)了壓縮紋理的顯示,需要的朋友可以參考下
    2022-09-09
  • Android ApplicationInfo 應(yīng)用程序信息的詳解

    Android ApplicationInfo 應(yīng)用程序信息的詳解

    這篇文章主要介紹了Android ApplicationInfo 應(yīng)用程序信息的詳解的相關(guān)資料,希望通過(guò)本文能幫助到大家,需要的朋友可以參考下
    2017-10-10
  • Android實(shí)現(xiàn)閃光燈效果

    Android實(shí)現(xiàn)閃光燈效果

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)閃光燈效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • Android 藍(lán)牙自動(dòng)匹配PIN碼跳過(guò)用戶(hù)交互示例

    Android 藍(lán)牙自動(dòng)匹配PIN碼跳過(guò)用戶(hù)交互示例

    本篇文章主要介紹了Android 藍(lán)牙自動(dòng)匹配PIN碼跳過(guò)用戶(hù)交互示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • Android拍照裁剪圖片

    Android拍照裁剪圖片

    智能手機(jī)像素非常高,完全可以當(dāng)相機(jī)使用,下面一段代碼給大家分享了android拍照裁剪圖片的功能,對(duì)android拍照裁剪圖片相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧
    2015-12-12
  • Android頁(yè)面中引導(dǎo)蒙層的使用方法詳解

    Android頁(yè)面中引導(dǎo)蒙層的使用方法詳解

    這篇文章主要為大家詳細(xì)介紹了Android頁(yè)面中的引導(dǎo)蒙層使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-03-03

最新評(píng)論

柳江县| 宜兴市| 长兴县| 兴化市| 仁化县| 花垣县| 松江区| 启东市| 锡林浩特市| 怀仁县| 彭阳县| 大英县| 宣城市| 上犹县| 巴楚县| 老河口市| 合江县| 康乐县| 伊川县| 喀什市| 报价| 景东| 平顶山市| 浦东新区| 射阳县| 渝北区| 白山市| 京山县| 井研县| 巴青县| 乌拉特前旗| 武鸣县| 京山县| 湘乡市| 樟树市| 陵水| 景东| 西盟| 合阳县| 砚山县| 高陵县|