RecyclerView出現已經有一段時間了,可以通過導入support-v7對其進行使用。
據官方的介紹,該控件用于在有限的窗口中展示大量數據集,
其實這樣功能的控件并不陌生,例如:ListView、GridView。
那么有了ListView、GridView為什么還需要RecyclerView這樣的控件呢?
整體上看RecyclerView架構,提供了一種插拔式的體驗,高度的解耦,異常的靈活,
通過設置它提供的不同LayoutManager,
ItemDecoration , ItemAnimator實現非常炫的效果。
你想要控制其顯示的方式,
請通過布局管理器LayoutManager你想要控制Item間的間隔(可繪制),
請通過ItemDecoration你想要控制Item增刪的動畫,
請通過ItemAnimator你想要控制點擊、長按事件,自己實現。。。。。。。
實現非常簡單
布局文件:
在RecyclerView包裹SwipeRefreshLayout
<android.support.v4.widget.SwipeRefreshLayout android:id="@+id/swipe_refresh_widget" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@+id/editTextRelayout"> <com.gsl.demo.utils.RefreshRecyclerView android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@+id/editTextRelayout" android:dividerHeight="18dp" android:scrollbars="vertical" /> </android.support.v4.widget.SwipeRefreshLayout>RefreshRecyclerView(自定義的view)
public class RefreshRecyclerView extends RecyclerView { PRivate AutoLoadAdapter autoLoadAdapter; public RefreshRecyclerView(Context context) { this(context, null); } public RefreshRecyclerView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public RefreshRecyclerView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(); } private boolean isLoadingMore = false;//是否正在加載更多 private OnLoadMoreListener loadMoreListener;//加載數據監聽 private boolean loadMoreEnable = false;//是否允許加載更多 private int footerResource = -1;//腳布局 private boolean footer_visible = false;//腳部是否可以見 private void init() { setOnScrollListener(new OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); if (getAdapter() != null && getLayoutManager() != null) { int lastVisiblePosition = ((LinearLayoutManager) getLayoutManager()).findLastVisibleItemPosition(); int itemCount = getAdapter().getItemCount(); /** * 控制下拉刷新回調 * itemCount != 0 排除沒有數據情況 * lastVisiblePosition + 4 >= itemCount - 1 最后可見+4 >= 總條數 加載更多 * distanceY < 0 為上拉的時候才刷新 */ if (distanceY < 0 && itemCount != 0 && lastVisiblePosition + 4 >= itemCount - 1 && !isLoadingMore && loadMoreEnable) { Log.i("test","加載更多"); //正在加載更多 loading(); if (footerResource != -1){//有腳布局 //顯示腳布局 footer_visible = true; getAdapter().notifyItemChanged(itemCount - 1); } if (loadMoreListener != null) { loadMoreListener.loadMoreListener(); } } } } }); } /** * 判斷滑動方向 */ private float distanceY = 0; float startY = 0; @Override public boolean dispatchTouchEvent(MotionEvent ev) { float y = ev.getRawY(); switch (ev.getAction()){ case MotionEvent.ACTION_DOWN: startY = y; break; case MotionEvent.ACTION_MOVE: distanceY = y - startY; startY = y; break; } return super.dispatchTouchEvent(ev); } @Override public void setAdapter(Adapter adapter) { SlideInBottomAnimationAdapter slideInBottomAnimationAdapter = new SlideInBottomAnimationAdapter(adapter); slideInBottomAnimationAdapter.setDuration(600); autoLoadAdapter = new AutoLoadAdapter(slideInBottomAnimationAdapter);//添加動畫 super.setAdapter(autoLoadAdapter); } /** * 設置是否允許加載更多 * * @param isEnable */ public void setLoadMoreEnable(boolean isEnable) { this.loadMoreEnable = isEnable; } /** * 設置腳布局 */ public void setFooterResource(int footerResource) { this.footerResource = footerResource; } /** * 加載完成 */ private void loadMoreComplete() { this.isLoadingMore = false; } /** * 正在刷新 */ private void loading(){ this.isLoadingMore = true;//設置正在刷新 } /** * 加載更多數據回調 * * @param listener */ public void setOnLoadMoreListener(OnLoadMoreListener listener) { this.loadMoreListener = listener; } public interface OnLoadMoreListener { void loadMoreListener();//上拉刷新 } /** * 刷新數據 */ public void notifyData() { if (getAdapter() != null) { loadMoreComplete(); if(footerResource != -1 && loadMoreEnable){ //隱藏腳布局 footer_visible = false; } getAdapter().notifyDataSetChanged(); } } public class AutoLoadAdapter extends Adapter<ViewHolder> { private Adapter dataAdapter;//數據adapter private final int TYPE_FOOTER = Integer.MAX_VALUE;//底部布局 public AutoLoadAdapter(Adapter adapter) { this.dataAdapter = adapter; } @Override public int getItemViewType(int position) { if (position == getItemCount() - 1 && loadMoreEnable && footerResource != -1 && footer_visible) { return TYPE_FOOTER; } if (dataAdapter.getItemViewType(position) == TYPE_FOOTER) { throw new RuntimeException("adapter中itemType不能為:" + Integer.MAX_VALUE); } return dataAdapter.getItemViewType(position); } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { ViewHolder holder = null; if (viewType == TYPE_FOOTER) {//腳部 holder = new FooterViewHolder(LayoutInflater.from(getContext()).inflate(footerResource, parent, false)); } else {//數據 holder = dataAdapter.onCreateViewHolder(parent, viewType); } return holder; } @Override public void onBindViewHolder(ViewHolder holder, int position) { int itemViewType = getItemViewType(position); if (itemViewType != TYPE_FOOTER) { dataAdapter.onBindViewHolder(holder, position); } } @Override public int getItemCount() { if (dataAdapter.getItemCount() != 0) { int count = dataAdapter.getItemCount(); if (loadMoreEnable && footerResource != -1 && footer_visible) { count++; } return count; } return 0; } public class FooterViewHolder extends ViewHolder { public FooterViewHolder(View itemView) { super(itemView); } } }}activity中:
mSwipeRefreshLayout.setColorSchemeResources(android.R.color.holo_red_light, android.R.color.ho lo_blue_light, android.R.color.holo_green_light); recyclerView.setLoadMoreEnable(true);//允許加載更多 recyclerView.setFooterResource(R.layout.item_footer);//設置腳布局 recyclerView.setOnLoadMoreListener(new RefreshRecyclerView.OnLoadMoreListener() { @Override public void loadMoreListener() { handler.postDelayed(new Runnable() { @Override public void run() { for (int i = 0; i < 10; i++) { statisticsResponseModel = new StatisticsResponseModel(); statisticsResponseModel.setName("OK" + i); mList.add(statisticsResponseModel); } mRefreshAdapter.setmList(mList); recyclerView.notifyData();//刷新數據 } }, 5000); } });//分頁 mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { handler.postDelayed(new Runnable() { @Override public void run() { mSwipeRefreshLayout.setRefreshing(false); recyclerView.notifyData();//刷新數據 } }, 2000); } }); }//下拉刷新gradle文件添加:
compile 'jp.wasabeef:recyclerview-animators:1.3.0'有問題聯系:1808418098(微信、QQ)
新聞熱點
疑難解答