簡介java
RecyclerView是從Android 5.0開始,谷歌公司推出的一個用於大量數據展現的心控件,在必定程度上能夠代替android
傳統的ListView,更強大,更靈活ide
RecyclerView是v7包中的新組件,是一個強大的滑動組件,與經典的ListView相比,一樣擁有Item的的回收複用功能,.佈局
RecyclerView的優點:動畫
RecyclerView並不能徹底替代ListView,二者的使用場景不同,相比於Lisetview的優勢:this
1.RecyclerView封裝了Viewholder的回收複用,也就是說RecyclerView標準化了Viewholder,編寫Adapter面向的是Viewholder而不是View.spa
2.提供了一種插拔式的體驗,高度的解耦,異常的靈活,針對一個Item的顯示RecyclerView專門抽取出了相應的類,來控制Item的顯示,使其的擴展性很是強。code
3.設置佈局管理器以控制Item的佈局方式,橫向、豎向以及瀑布流方式
例如:你想控制橫向或者縱向滑動列表效果能夠經過LinearLayoutManager這個類來進行控制(與GridView效果對應的是GridLayoutManager,與瀑布流對應的還StaggeredGridLayoutManager等)。也就是說RecyclerView再也不拘泥於ListView的線性展現方式,它也能夠實現GridView的效果等多種效果。blog
4.可設置Item的間隔樣式(可繪製)
經過繼承RecyclerView的ItemDecoration這個類,而後針對本身的業務需求去書寫代碼。繼承
5.能夠控制Item增刪的動畫,能夠經過ItemAnimator這個類進行控制,固然針對增刪的動畫,RecyclerView有其本身默認的實現。
可是關於item的點擊和長按事件,須要用戶本身取實現
基本使用:
導入依賴
implementation 'com.android.support:recyclerview-v7:28.0.0'
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());
在使用RecyclerView的時候,必須指定一個適配器和一個佈局管理器
適配器Apdater繼承RecyclerView.Adapter類
RecyclerView.Adapter<VH>
的Adapter類(VH是ViewHolder的類名)
RecyclerView.ViewHolder實現方式基本與lisetview同樣
package com.hejun.movie; import android.content.Context; import android.content.Intent; import android.support.annotation.NonNull; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.RatingBar; import android.widget.TextView; import com.bumptech.glide.Glide; import com.orhanobut.logger.Logger; import java.io.Serializable; import java.util.List; import butterknife.BindView; import butterknife.ButterKnife; class GridAdapter extends RecyclerView.Adapter<GridAdapter.ViewHolder> { private Context context; private List<JsonBean.MoviesBean> list; public GridAdapter(Context context, List<JsonBean.MoviesBean> list) { this.context = context; this.list = list; } /** * 加載item佈局 * @param viewGroup * @param i * @return */ @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) { View view = LayoutInflater.from(context).inflate(R.layout.griditem, viewGroup, false); return new ViewHolder(view); } /** * 加載數據 * @param viewHolder * @param i */ @Override public void onBindViewHolder(@NonNull ViewHolder viewHolder, int i) { final JsonBean.MoviesBean moviesBean = list.get(i); Glide.with(context).load(moviesBean.getImageUrl()).into(viewHolder.imag); viewHolder.itemText.setText(moviesBean.getTitle()); viewHolder.stars.setRating((float) (moviesBean.getRating().getAverage() / 2)); viewHolder.itemText2.setText(String.valueOf(moviesBean.getRating().getAverage())); // Logger.v(String.valueOf((float) moviesBean.getRating().getAverage() / 2)); //設置item點擊事件 viewHolder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //todo: 跳轉詳情頁面 Intent intent = new Intent(context,DetailsActivity.class); intent.putExtra("movies", moviesBean); context.startActivity(intent); } }); } /** * 獲取item數量 * @return */ @Override public int getItemCount() { return list.size(); } /** * 自定義ViewHolder */ static class ViewHolder extends RecyclerView.ViewHolder { @BindView(R.id.imag) ImageView imag; @BindView(R.id.item_text) TextView itemText; @BindView(R.id.stars) RatingBar stars; @BindView(R.id.item_text2) TextView itemText2; ViewHolder(@NonNull View itemView) { super(itemView); ButterKnife.bind(this, itemView); } } }
LayoutManager 佈局管理器
RecyclerView提供了三種佈局管理器:
LayoutManager常見API
canScrollHorizontally();//可否橫向滾動 canScrollVertically();//可否縱向滾動 scrollToPosition(int position);//滾動到指定位置 setOrientation(int orientation);//設置滾動的方向 getOrientation();//獲取滾動方向 findViewByPosition(int position);//獲取指定位置的Item View findFirstCompletelyVisibleItemPosition();//獲取第一個徹底可見的Item位置 findFirstVisibleItemPosition();//獲取第一個可見Item的位置 findLastCompletelyVisibleItemPosition();//獲取最後一個徹底可見的Item位置 findLastVisibleItemPosition();//獲取最後一個可見Item的位置