安卓RecyclerView的使用以及抽取基類
安卓RecyclerView的使用以及抽取基類
1.引入:
在moudle中的build.gradle檔案裡,找到dependencies,新增關於recyclerView的引用:
compile 'com.android.support:recyclerview-v7:24.2.0' //這裡的版本需要和V7包相對
其實design包中含有Material Design相關的很多控制元件,其中也包括了recyclerView的程式碼,所以你也可以通過引用design包來使用recyclerView:
compile 'com.android.support:design:23.2.0' //同樣的版本需要一樣
2.在Xml中的使用:
<android.support.v7.widget.RecyclerView
android:id="@+id/rv"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
3.在程式碼中的使用:
- RecyclerView需要設定樣式才能顯示出資料:
new LinearLayoutManager(getApplicationContext()); //顯示為listView樣式
new GridLayoutManager(getApplicationContext(),3); //顯示為Grid樣式
//顯示為橫向的Grid true為是否逆轉
new GridLayoutManager(getApplicationContext(), 3, GridLayoutManager.HORIZONTAL, false);
//顯示為瀑布流 可以設定方向
new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL);
mRv = (RecyclerView) findViewById(R.id.rv); //找到控制元件
//必須要設定layout樣式才能使用
mLinearLayoutManager = new LinearLayoutManager(getApplicationContext());
mRv.setLayoutManager(mLinearLayoutManager);
- 可以給每個Item設定動畫效果,可也自定義可以使用第三方:
我這裡使用的是第三方,自定義的比較麻煩,下面是依賴地址:
compile 'jp.wasabeef:recyclerview-animators:2.2.6'
下面是程式碼中的使用:
//可以給item設定動畫 使用的是第三方動畫庫
mRv.setItemAnimator(new FadeInRightAnimator());
RecyclerView必須自定義分割線,這裡也是使用的第三方
compile 'com.yqritc:recyclerview-flexibledivider:1.4.0'
//手動設定分割線 使用的第三方
mRv.addItemDecoration(new HorizontalDividerItemDecoration.Builder(this)
.color(Color.RED) //顏色
.size(2) //大小
.margin(0,2) //距離
.build());
5.Adpater類程式碼
RecyclerView中的Adapter與ListView中的Adapter不同:這裡直接加上了樣式的選擇.
public class myAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
//確定資料個數
@Override
public int getItemCount() {
return mData.size();
}
@Override
public int getItemViewType(int position) {
//可能根據資料的欄位來指定對應的type
if(position%2==0){
return TYPE_ONE;
}else{
return TYPE_TWO;
}
}
//確定佈局
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
//當有多個Item樣式時先進行判斷
if (viewType == TYPE_ONE){
//載入佈局
View inflate = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false);
//建立ViewHolder物件
MyViewHolder myHolederView = new MyViewHolder(inflate);
//查詢控制元件
myHolederView.tv = (TextView) inflate.findViewById(tv);
return myHolederView;
}
//顯示不同的佈局
if (viewType == TYPE_TWO){
//建立不同的ViewHolder
return null;
}
return null;
}
//設定值
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
//有可能會有多種Item的顯示樣式,所有在設定值之前要進行判斷
if (getItemViewType(position) == TYPE_ONE){
//設定值
MyViewHolder viewHolder = (MyViewHolder) holder;
viewHolder.tv.setText(mData.get(position));
}
if (getItemViewType(position) == position){
//強轉成不同的ViewHolder進行賦值
}
//設定Item的點選事件
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//點選事件回撥到Activity
if (mListerent != null){
mListerent.onitemLister(v,position);
}
}
});
}
}
RecyclerView中不提供Item的點選事件,這是隻能在Adapter中設定,但為了更好的編輯程式碼,需要把點選事件回撥到Activity中進行處理
建立一個介面回撥點選事件:
//設定一個回撥的介面 interface IRecyclerItemChangeListerent { void onitemLister(View v,int postion); }
6.上面介紹是對RecyclerView的初步使用,在專案中為了減低耦合,需要對Adapter類進行抽取,下面程式碼進行了簡單的抽取,可供參考使用:
public abstract class BaseAdapterss<T> extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
ArrayList<T> mData; //資料
IRecyclerItemChangeListerent mListerent; //回撥介面
//設定資料的方法
public void setData(ArrayList<T> data ){
this.mData = data;
}
//獲取顯示數量
@Override
public int getItemCount() {
return mData != null ? mData.size() : 0;
}
//設定點選事件藉口回撥
public void setListerent(IRecyclerItemChangeListerent listerent){
mListerent = listerent;
}
//設定一個回撥的介面
interface IRecyclerItemChangeListerent {
void onitemLister(View v, int postion);
}
//返回Item顯示的不同佈局
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
//抽象方法,子類出具體實現
return getLayout(parent,viewType);
}
//對Item的資料進行賦值
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
//抽象方法子類去具體實現
setItemData(holder,position);
//設定Item的點選事件
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//點選事件回撥到Activity
if (mListerent != null){
mListerent.onitemLister(v,position);
}
}
});
}
//抽象方法,子類實現具體操作
protected abstract void setItemData(RecyclerView.ViewHolder holder, int position);
protected abstract RecyclerView.ViewHolder getLayout(ViewGroup parent, int viewType);
}
模擬子類繼承
//具體操作 public class MyAdapters extends BaseAdapterss<String> { private static final int TYPE_ONE = 0; //item的顯示樣式 private static final int TYPE_TWO = 1; //item的顯示樣式 @Override public int getItemViewType(int position) { //可能根據資料的欄位來指定對應的type if(position%2==0){ return TYPE_ONE; }else{ return TYPE_TWO; } } @Override protected void setItemData(RecyclerView.ViewHolder holder, int position) { //有可能會有多種Item的顯示樣式,所有在設定值之前要進行判斷 if (getItemViewType(position) == TYPE_ONE){ //設定值 MyViewHolder viewHolder = (MyViewHolder) holder; viewHolder.tv.setText(mData.get(position)); } if (getItemViewType(position) == position){ //強轉成不同的ViewHolder進行賦值 } } @Override protected RecyclerView.ViewHolder getLayout(ViewGroup parent, int viewType) { //當有多個Item樣式時先進行判斷 if (viewType == TYPE_ONE){ //載入佈局 View inflate = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false); //建立ViewHolder物件 MyViewHolder myHolederView = new MyViewHolder(inflate); //查詢控制元件 myHolederView.tv = (TextView) inflate.findViewById(tv); return myHolederView; } //顯示不同的佈局 if (viewType == TYPE_TWO){ //建立不同的ViewHolder return null; } return null; } }
如有不懂的可以下載Dome看看,地址:https://github.com/MSHAO1/RecyclerViewDome
相關文章
- RecyclerView 效能優化 | 安卓 offer 收割基View優化安卓
- 【安卓筆記】CardView+RecyclerView使用示例安卓筆記View
- 打造基於Databinding與RecyclerView的通用Adapter類ViewAPT
- 【安卓筆記】RecyclerView+SwipeRefreshLayout示例安卓筆記View
- RecyclerView的使用View
- RecyclerView的使用總結以及常見問題解決方案View
- RecyclerView 的基本使用View
- RecyclerView使用View
- 教你玩轉 Android RecyclerView:深入解析 RecyclerView ItemDecoration類AndroidView
- RecyclerView的簡單使用View
- Android RecyclerView的使用AndroidView
- Android中使用RecyclerView + SnapHelper實現類似ViewPager效果AndroidViewpager
- [資訊抽取]基於ERNIE3.0的多對多資訊抽取演算法:屬性關係抽取演算法
- 關於字串分類抽取的幾個方法字串
- 判斷漲跌以及抽取股票名稱的原始碼原始碼
- 用RecyclerView實現類似支付寶應用圖示拖拽排序以及增刪管理的功能View排序
- 安卓開發中,什麼樣的功能適合抽取成 Library?安卓
- RecyclerView使用體驗View
- 論文閱讀:基於無監督整合聚類的開放關係抽取方法聚類
- APK加固之類抽取分析與修復APK
- Android開發 - RecyclerView 類詳解AndroidView
- Android中的RecyclerView: 基礎知識AndroidView
- Android中RecyclerView用法,一步一步教你如何使用RecyclerView以及帶你走過編碼中可能會出現的坑~AndroidView
- RecyclerView使用指南(四)—— 使用ItemDecorationView
- RecyclerView使用指南(一)—— 基本使用View
- 基於表示學習的資訊抽取方法淺析
- Java 的抽象類, 介面以及內部類Java抽象
- [kotlin]帶分類的RecyclerView通用實現新思路KotlinView
- 安卓EasyLib的使用安卓
- mac 使用 sed 抽取 json 中的欄位MacJSON
- Python類的基礎--設計、使用Python
- 基於路徑的實體圖關係抽取模型模型
- Java基礎-類載入器以及載入機制Java
- java 所有的集合類以及Apache的集合類???JavaApache
- RecyclerView Part 1:為ListView專家寫的基礎View
- 安卓基礎開發庫,DevRing使用說明安卓devVR
- 【python基礎】input函式的基礎使用以及進階Python函式
- Java 的異常以及File類Java