1:自定义recyclerView public class XListView extends SwipeRefreshLayout implements IXListViewListener, IXListViewListener.OnItemClick { private RecyclerView recyclerView; private IXListViewListener ixListViewListener;//刷新及加载更多回掉 private XListViewAdapter adapter; private boolean isLoadMore = true;//是否还能加载更多 private static final String TAG = "XListView"; private OnItemClick onItemClick; public XListView(Context context) { super(context); this.init(context); } public XListView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); this.init(context); } private void init(Context context) { this.recyclerView = new RecyclerView(context); final LinearLayoutManagerItem layoutManager = new LinearLayoutManagerItem(context); this.recyclerView.setLayoutManager(layoutManager); this.setColorSchemeColors(Color.RED, Color.GREEN, Color.YELLOW); this.recyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() { private int lastVisibleItem; @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); if (newState != RecyclerView.SCROLL_STATE_IDLE || layoutManager == null || !isLoadMore || isRefreshing()) return; int state = adapter.getStatus(); int visibleItemCount = layoutManager.getChildCount();//显示数量 int totalItemCount = adapter.getXlistViewItemCount() + 1;//总数 if (visibleItemCount > 0 && visibleItemCount <= totalItemCount && lastVisibleItem >= totalItemCount - 1 && XListViewAdapter.CLICK_MORE == state) { onLoadMore();//加载更多 } } @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); lastVisibleItem = -1; if (layoutManager == null && !isLoadMore) { return; } if (dy > 20) { lastVisibleItem = layoutManager.findLastVisibleItemPosition(); } } }); this.addView(this.recyclerView); } public void setLoadMore(boolean loadMore) { this.isLoadMore = loadMore; } /** * 加载更多完毕 */ public final void stopLoadMore(boolean isData) { if (this.adapter == null) return; if (isData) this.adapter.changeMoreStatus(XListViewAdapter.CLICK_MORE); else this.adapter.changeMoreStatus(XListViewAdapter.NO_DATA); this.setLoadMore(isData); } public final void setXListViewAdapter(XListView.XListViewAdapter adapter) { this.recyclerView.setAdapter(adapter); this.adapter = adapter; if (this.adapter != null) this.adapter.setIxListViewListener(this); } @Override public final void onRefresh() { if (ixListViewListener != null && !isLoadData()) this.ixListViewListener.onRefresh(); else this.setRefreshing(false); } @Override public final void onLoadMore() { if (this.ixListViewListener != null && !isRefreshing()) { this.ixListViewListener.onLoadMore(); if (this.adapter != null) this.adapter.changeMoreStatus(XListViewAdapter.LOADING_MORE); } } @Override public final void onItemClick(RecyclerView parent, View view, int position, long id) { if (this.onItemClick != null) this.onItemClick.onItemClick(parent, view, position, id); } public final void setOnItemClick(OnItemClick onItemClick) { this.onItemClick = onItemClick; } public final void setOnRefreshListener(IXListViewListener ixListViewListener) { this.ixListViewListener = ixListViewListener; super.setOnRefreshListener(this); if (this.adapter != null) this.adapter.setIxListViewListener(this); } private boolean isLoadData() { return XListViewAdapter.LOADING_MORE == this.adapter.getStatus(); } public class LinearLayoutManagerItem extends LinearLayoutManager { public LinearLayoutManagerItem(Context context) { super(context); } @Override public RecyclerView.LayoutParams generateDefaultLayoutParams() { return new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); } } /** * 适配器,需要继承 * * @param <VH> */ public static abstract class XListViewAdapter<VH extends RecyclerView.ViewHolder> extends RecyclerView.Adapter implements OnClickListener { private static final int TYPE_FOOTER = 10000; //顶部FootView public static final int LOADING_MORE = 1;//正在加载中 public static final int CLICK_MORE = 3;//点击加载更多数据 public static final int NO_DATA = 2;//没有更多数据 private int status = CLICK_MORE;//上拉加载更多状态-默认为0 private XListView xListView; public Context getContext() { return xListView.getContext(); } @Override public final int getItemViewType(int position) { int itemCount = getXlistViewItemCount(); if (position == itemCount && xListView.isLoadMore) { return TYPE_FOOTER; } else { return getXlistItemViewType(position); } } @Override public final int getItemCount() { int count = getXlistViewItemCount(); if (count <= 0) return count; else return count + (xListView.isLoadMore ? 1 : 0); } @Override public final RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if (viewType == TYPE_FOOTER) {//显示底部布局 View layout = LayoutInflater.from(getContext()).inflate(R.layout.footer_layout, null); FootViewHolder footViewHolder = new FootViewHolder(layout); footViewHolder.textView = (TextView) layout.findViewById(R.id.footer); layout.setOnClickListener(this); footViewHolder.progressBar = (ProgressBar) layout.findViewById(R.id.progressBar); return footViewHolder; } RecyclerView.ViewHolder holder = onXlistViewCreateViewHolder(parent, viewType); holder.itemView.setOnClickListener(this); return holder; } @Override public final void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { String tag = holder.getClass().getName(); if (holder instanceof FootViewHolder) { FootViewHolder footViewHolder = (FootViewHolder) holder; String text = "上拉加载更多..."; int visibility = View.GONE; switch (status) { case LOADING_MORE: text = "正在加载更多数据..."; visibility = View.VISIBLE; break; case NO_DATA: text = "没有更多数据"; break; case CLICK_MORE: text = "点击加载更多"; break; } footViewHolder.progressBar.setVisibility(visibility); footViewHolder.textView.setText(text); } else { tag = TAG; onXlistViewBindViewHolder(holder, position); } holder.itemView.setTag(position + tag); } public abstract RecyclerView.ViewHolder onXlistViewCreateViewHolder(ViewGroup parent, int viewType); public abstract void onXlistViewBindViewHolder(RecyclerView.ViewHolder holder, int position); public abstract int getXlistViewItemCount(); public int getXlistItemViewType(int position) { return super.getItemViewType(position); } public final void changeMoreStatus(int status) { this.status = status; this.notifyDataSetChanged(); } public final int getStatus() { return status; } @Override public final void onClick(View v) { if (v == null) return; String tag = v.getTag().toString(); if (TextUtils.isEmpty(tag)) return; if (CLICK_MORE == status && xListView != null && tag.contains(FootViewHolder.class.getName())) { this.xListView.onLoadMore();//加载更多 return; } else if (tag.contains(TAG)) { int position = -1; try { position = Integer.parseInt(tag.replaceAll(TAG, "").trim()); } catch (Exception e) { e.printStackTrace(); } if (position < 0) return; this.xListView.onItemClick(xListView.recyclerView, v, position, v.getId()); } } public final void setIxListViewListener(XListView ixListViewListener) { this.xListView = ixListViewListener; } } /** * 底部加载显示view */ static class FootViewHolder extends RecyclerView.ViewHolder { TextView textView; ProgressBar progressBar; public FootViewHolder(View itemView) { super(itemView); } } }
2:刷新和家长更多,条目接口
public interface IXListViewListener extends SwipeRefreshLayout.OnRefreshListener { void onLoadMore(); interface OnItemClick { void onItemClick(RecyclerView parent, View view, int position, long id); } }
3:footer item (footer_layout.xml)
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:orientation="horizontal" android:padding="10dp"> <ProgressBar android:id="@+id/progressBar" android:layout_width="18dp" android:layout_height="16dp" /> <TextView android:id="@+id/footer" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:text="测试" android:textSize="14sp" /> </LinearLayout>
4:下载地址 http://download.csdn.net/detail/xingwei08246/9777153