2.本庫優點亮點php
3.如何使用介紹android
4.關於狀態切換git
5.經常使用api介紹github
6.recyclerView的wiki文檔【更新中】數據庫
7.實現效果展現segmentfault
03.ViewHolder性能優化
首先在集成:
在佈局中
<org.yczbj.ycrefreshviewlib.YCRefreshView xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_progress="@layout/view_custom_loading_data" app:layout_empty="@layout/view_custom_empty_data" app:layout_error="@layout/view_custom_data_error"/>
在代碼中,初始化recyclerView
adapter = new PersonAdapter(this); recyclerView.setAdapter(adapter); final LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this); recyclerView.setLayoutManager(linearLayoutManager); adapter.addAll(data);
在代碼中,建立adapter實現RecyclerArrayAdapter<T>
public class PersonAdapter extends RecyclerArrayAdapter<PersonData> { public PersonAdapter(Context context) { super(context); } @Override public BaseViewHolder OnCreateViewHolder(ViewGroup parent, int viewType) { return new PersonViewHolder(parent); } public class PersonViewHolder extends BaseViewHolder<PersonData> { private ImageView iv_news_image; PersonViewHolder(ViewGroup parent) { super(parent, R.layout.item_news); iv_news_image = getView(R.id.iv_news_image); } @Override public void setData(final PersonData person){ } } }
下拉刷新監聽操做
//設置刷新listener recyclerView.setRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { //刷新操做 } }); //設置是否刷新 recyclerView.setRefreshing(false); //設置刷新顏色 recyclerView.setRefreshingColorResources(R.color.colorAccent);
上拉加載更多監聽操做
//設置上拉加載更多時佈局,以及監聽事件 adapter.setMore(R.layout.view_more, new OnLoadMoreListener() { @Override public void onLoadMore() { //能夠作請求下一頁操做 } });
adapter.setMore(R.layout.view_more2, new OnMoreListener() { @Override public void onMoreShow() { //不作處理 } @Override public void onMoreClick() { //點擊觸發加載下一頁數據 } });
在上拉加載更多時,可能出現沒有更多數據,或者上拉加載失敗,該如何處理呢?
//設置上拉加載沒有更多數據監聽 adapter.setNoMore(R.layout.view_no_more, new OnNoMoreListener() { @Override public void onNoMoreShow() { //上拉加載,沒有更多數據展現,這個方法能夠暫停或者中止加載數據 adapter.pauseMore(); } @Override public void onNoMoreClick() { //這個方法是點擊沒有更多數據展現佈局的操做,好比能夠作吐司等等 Log.e("逗比","沒有更多數據了"); } }); //設置上拉加載更多異常監聽數據監聽 adapter.setError(R.layout.view_error, new OnErrorListener() { @Override public void onErrorShow() { //上拉加載,加載更多數據異常展現,這個方法能夠暫停或者中止加載數據 adapter.pauseMore(); } @Override public void onErrorClick() { //這個方法是點擊加載更多數據異常展現佈局的操做,好比恢復加載更多等等 adapter.resumeMore(); } });
添加headerView操做。至於添加footerView的操做,幾乎和添加header步驟是同樣的。
adapter.addHeader(new InterItemView() { @Override public View onCreateView(ViewGroup parent) { View inflate = LayoutInflater.from(context).inflate(R.layout.header_view, null); return inflate; } @Override public void onBindView(View headerView) { TextView tvTitle = headerView.findViewById(R.id.tvTitle); } });
adapter.addHeader(new InterItemView() { @Override public View onCreateView(ViewGroup parent) { RecyclerView recyclerView = new RecyclerView(parent.getContext()){ //爲了避免打擾橫向RecyclerView的滑動操做,能夠這樣處理 @SuppressLint("ClickableViewAccessibility") @Override public boolean onTouchEvent(MotionEvent event) { super.onTouchEvent(event); return true; } }; return recyclerView; } @Override public void onBindView(View headerView) { //這裏的處理別忘了 ((ViewGroup)headerView).requestDisallowInterceptTouchEvent(true); } });
注意要點
添加全部數據,能夠是集合,也能夠是數組
//添加全部數據 adapter.addAll(data); //添加單挑數據 adapter.add(data);
插入,刷新和刪除數據
//插入指定索引數據,單個數據 adapter.insert(data, pos); //插入指定索引數據,多個數據 adapter.insertAll(data, pos); //刷新指定索引數據 adapter.update(data, pos); //刪除數據,指定數據 adapter.remove(data); //刪除數據,指定索引 adapter.remove(pos); //清空全部數據
注意自定義adapter須要實現RecyclerArrayAdapter<T>,其中T是泛型,就是你要使用的bean數據類型
public class PersonAdapter extends RecyclerArrayAdapter<PersonData> { public PersonAdapter(Context context) { super(context); } @Override public BaseViewHolder OnCreateViewHolder(ViewGroup parent, int viewType) { return new PersonViewHolder(parent); } public class PersonViewHolder extends BaseViewHolder<PersonData> { private TextView tv_title; private ImageView iv_news_image; PersonViewHolder(ViewGroup parent) { super(parent, R.layout.item_news); iv_news_image = getView(R.id.iv_news_image); tv_title = getView(R.id.tv_title); //添加孩子的點擊事件 addOnClickListener(R.id.iv_news_image); addOnClickListener(R.id.tv_title); } @Override public void setData(final PersonData person){ Log.i("ViewHolder","position"+getDataPosition()); tv_title.setText(person.getName()); } } }
條目單擊點擊事件,長按事件[省略,能夠本身看代碼]
adapter.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(int position) { if (adapter.getAllData().size()>position && position>=0){ //處理點擊事件邏輯 } } });
條目中孩子的點擊事件
//添加孩子的點擊事件,能夠看3.5設置adapter addOnClickListener(R.id.iv_news_image); addOnClickListener(R.id.tv_title); //設置孩子的點擊事件 adapter.setOnItemChildClickListener(new OnItemChildClickListener() { @Override public void onItemChildClick(View view, int position) { switch (view.getId()){ case R.id.iv_news_image: Toast.makeText(HeaderFooterActivity.this, "點擊圖片了",Toast.LENGTH_SHORT).show(); break; case R.id.tv_title: Toast.makeText(HeaderFooterActivity.this, "點擊標題",Toast.LENGTH_SHORT).show(); break; default: break; } } });
在佈局文件中,這裏省略部分代碼
<org.yczbj.ycrefreshviewlib.swipeMenu.YCSwipeMenu android:orientation="horizontal"> <!--item內容--> <RelativeLayout </RelativeLayout> <!-- 側滑菜單 --> <Button android:id="@+id/btn_del"/> <Button android:id="@+id/btn_top"/> </org.yczbj.ycrefreshviewlib.swipeMenu.YCSwipeMenu>
在代碼中設置
private OnSwipeMenuListener listener; public void setOnSwipeMenuListener(OnSwipeMenuListener listener) { this.listener = listener; }
View.OnClickListener clickListener = new View.OnClickListener() { @Override public void onClick(View v) { switch (v.getId()){ case R.id.btn_del: if (null != listener) { listener.toDelete(getAdapterPosition()); } break; case R.id.btn_top: if (null != listener) { listener.toTop(getAdapterPosition()); } break; } } }; btn_del.setOnClickListener(clickListener); btn_top.setOnClickListener(clickListener);
處理置頂或者刪除的功能
adapter.setOnSwipeMenuListener(new OnSwipeMenuListener() { //刪除功能 @Override public void toDelete(int position) { } //置頂功能 @Override public void toTop(int position) { } });
處理長按拖拽,滑動刪除的功能。輕量級,自由選擇是否實現。
mCallback = new DefaultItemTouchHelpCallback(new DefaultItemTouchHelpCallback .OnItemTouchCallbackListener() { @Override public void onSwiped(int adapterPosition) { // 滑動刪除的時候,從數據庫、數據源移除,並刷新UI } @Override public boolean onMove(int srcPosition, int targetPosition) { return false; } }); mCallback.setDragEnable(true); mCallback.setSwipeEnable(true); mCallback.setColor(this.getResources().getColor(R.color.colorAccent)); ItemTouchHelper itemTouchHelper = new ItemTouchHelper(mCallback); itemTouchHelper.attachToRecyclerView(recyclerView);
YCRecyclerView是一個組合自定義控件,其佈局以下所示
<!--刷新控件 省略部分代碼--> <android.support.v4.widget.SwipeRefreshLayout> <FrameLayout> <!--RecyclerView控件--> <android.support.v7.widget.RecyclerView/> <!--加載數據爲空時的佈局--> <FrameLayout/> <!--正在加載數據中的佈局--> <FrameLayout/> <!--加載錯誤時的佈局:網絡錯誤或者請求數據錯誤--> <FrameLayout/> </FrameLayout> </android.support.v4.widget.SwipeRefreshLayout>
關於頁面狀態切換的思路
而本庫採用的作法思路
以下所示
//設置加載數據完畢狀態 recyclerView.showRecycler(); //設置加載數據爲空狀態 recyclerView.showEmpty(); //設置加載錯誤狀態 recyclerView.showError(); //設置加載數據中狀態 recyclerView.showProgress();
以下所示
//設置空狀態頁面自定義佈局 recyclerView.setEmptyView(R.layout.view_custom_empty_data); recyclerView.setEmptyView(view); //獲取空頁面自定義佈局 View emptyView = recyclerView.getEmptyView(); //設置異常狀態頁面自定義佈局 recyclerView.setErrorView(R.layout.view_custom_data_error); recyclerView.setErrorView(view); //設置加載loading狀態頁面自定義佈局 recyclerView.setProgressView(R.layout.view_progress_loading); recyclerView.setProgressView(view);
有時候,加載頁面出現異常狀況,好比沒有網絡會顯示自定義的網絡異常頁面。如今須要點擊異常頁面按鈕等等操做,那麼該如何作呢?
//注意須要 LinearLayout ll_error_view = (LinearLayout) recyclerView.findViewById(R.id.ll_error_view); ll_error_view.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //好比,跳轉到網絡設置頁面,或者再次刷新數據,或者其餘操做等等 } });
狀態切換方法說明
//設置加載數據完畢狀態 recyclerView.showRecycler(); //設置加載數據爲空狀態 recyclerView.showEmpty(); //設置加載錯誤狀態 recyclerView.showError(); //設置加載數據中狀態 recyclerView.showProgress(); //設置自定義佈局,其餘幾個方法同理 recyclerView.setEmptyView(R.layout.view_custom_empty_data);
viewHolder方法說明
//子類設置數據方法 setData方法 //findViewById方式 iv_news_image = getView(R.id.iv_news_image); //獲取上下文 Context context = getContext(); //獲取數據索引的位置 int dataPosition = getDataPosition(); //添加item中子控件的點擊事件 addOnClickListener(R.id.tv_title);
adapter方法說明
//刪除索引處的數據 adapter.remove(0); //觸發清空全部數據 adapter.removeAll(); //添加數據,注意這個是在最後索引處添加 adapter.add(new PersonData()); //添加全部數據 adapter.addAll(DataProvider.getPersonList(0)); //插入數據 adapter.insert(data,3); //在某個索引處插入集合數據 adapter.insertAll(data,3); //獲取item索引位置 adapter.getPosition(data); //觸發清空全部的數據 adapter.clear(); //獲取全部的數據 adapter.getAllData(); //清除全部footer adapter.removeAllFooter(); //清除全部header adapter.removeAllHeader(); //添加footerView adapter.addFooter(view); //添加headerView adapter.addHeader(view); //移除某個headerView adapter.removeHeader(view); //移除某個footerView adapter.removeFooter(view); //獲取某個索引處的headerView adapter.getHeader(0); //獲取某個索引處的footerView adapter.getFooter(0); //獲取footer的數量 adapter.getFooterCount(); //獲取header的數量 adapter.getHeaderCount(); //設置上拉加載更多的自定義佈局和監聽 adapter.setMore(R.layout.view_more,listener); //設置上拉加載更多的自定義佈局和監聽 adapter.setMore(view,listener); //設置上拉加載沒有更多數據佈局 adapter.setNoMore(R.layout.view_nomore); //設置上拉加載沒有更多數據佈局 adapter.setNoMore(view); //設置上拉加載沒有更多數據監聽 adapter.setNoMore(R.layout.view_nomore,listener); //設置上拉加載異常的佈局 adapter.setError(R.layout.view_error); //設置上拉加載異常的佈局 adapter.setError(view); //設置上拉加載異常的佈局和異常監聽 adapter.setError(R.layout.view_error,listener); //暫停上拉加載更多 adapter.pauseMore(); //中止上拉加載更多 adapter.stopMore(); //恢復上拉加載更多 adapter.resumeMore(); //獲取上下文 adapter.getContext(); //應該使用這個獲取item個數 adapter.getCount(); //設置操做數據[增刪改查]後,是否刷新adapter adapter.setNotifyOnChange(true); //設置孩子點擊事件 adapter.setOnItemChildClickListener(listener); //設置條目點擊事件 adapter.setOnItemClickListener(listener); //設置條目長按事件 adapter.setOnItemLongClickListener(listener);
分割線方法說明
//能夠設置線條顏色和寬度的分割線 //四個參數,上下文,方向,線寬,顏色 final RecycleViewItemLine line = new RecycleViewItemLine(this, LinearLayout.HORIZONTAL, (int)AppUtils.convertDpToPixel(1,this), this.getResources().getColor(R.color.color_f9f9f9)); recyclerView.addItemDecoration(line); //適用於瀑布流中的間距設置 SpaceViewItemLine itemDecoration = new SpaceViewItemLine( (int) AppUtils.convertDpToPixel(8,this)); itemDecoration.setPaddingEdgeSide(true); itemDecoration.setPaddingStart(true); itemDecoration.setPaddingHeaderFooter(true); recyclerView.addItemDecoration(itemDecoration); //能夠設置線條顏色和寬度,而且能夠設置距離左右的間距 DividerViewItemLine itemDecoration = new DividerViewItemLine( this.getResources().getColor(R.color.color_f9f9f9) , LibUtils.dip2px(this, 1f), LibUtils.dip2px(this, 72), 0); itemDecoration.setDrawLastItem(false); recyclerView.addItemDecoration(itemDecoration);
很是感謝前輩大神的封裝思路和代碼案例,感謝!!!