1.布局文件部分
bottom_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="30dp" android:gravity="center" > <ProgressBar android:id="@+id/progress" android:layout_width="wrap_content" android:layout_height="wrap_content" android:progressDrawable="@drawable/anim_progress" //这个可以根据需求进行更改 android:indeterminate="true" /> <TextView android:id="@+id/bottom_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:text="加载中" /> </LinearLayout>
anim_progress.xml
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@android:id/background"> <shape> <corners android:radius="5dip" /> <gradient android:angle="0" android:centerColor="#ff5a5d5a" android:centerY="0.75" android:endColor="#ff747674" android:startColor="#ff9d9e9d" /> </shape> </item> <item android:id="@android:id/secondaryProgress"> <clip> <shape> <corners android:radius="5dip" /> <gradient android:angle="0" android:centerColor="#80ffb600" android:centerY="0.75" android:endColor="#a0ffcb00" android:startColor="#80ffd300" /> </shape> </clip> </item> <item android:id="@android:id/progress"> <clip> <shape> <corners android:radius="5dip" /> <gradient android:angle="0" android:endColor="#8000ff00" android:startColor="#80ff0000" /> </shape> </clip> </item> </layer-list>
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.chint.vstori.customrecycleview.MainActivity"> <android.support.v4.widget.SwipeRefreshLayout android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/swipe"> <android.support.v7.widget.RecyclerView android:id="@+id/recycle_view" android:layout_width="match_parent" android:layout_height="match_parent"/> </android.support.v4.widget.SwipeRefreshLayout> </LinearLayout>
2.定义的适配器部分
public abstract class BaseLoadAdapter<T> extends RecyclerView.Adapter { public static final int TYPE_ITEM = 1; public static final int TYPE_BOTTOM = 2; public int loadState; public static final int STATE_LOADING = 1; public static final int STATE_LASTED = 2; public static final int STATE_ERROR = 3; boolean hasMore = true; boolean isLoading = false; private int pageCount = 10; public List<T> list; @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if (viewType == TYPE_BOTTOM) {//上拉加载部分 return new BottomViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.bottom_layout, parent, false)); } else { return setItemViewHolder(parent, viewType);//正常数据加载 } } protected abstract RecyclerView.ViewHolder setItemViewHolder(ViewGroup parent, int viewType); @Override public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) { if (TYPE_BOTTOM == getItemViewType(position)) { final ProgressBar progressBar = ((BottomViewHolder) holder).progressBar; final TextView bottomTextView = ((BottomViewHolder) holder).bottomTextView; switch (loadState) { case STATE_LOADING: progressBar.setVisibility(View.VISIBLE); bottomTextView.setText("加载中"); holder.itemView.setOnClickListener(null); hasMore = true; break; case STATE_LASTED: progressBar.setVisibility(View.GONE); bottomTextView.setText("没有更多了"); holder.itemView.setOnClickListener(null); hasMore = false; break; case STATE_ERROR: progressBar.setVisibility(View.GONE); bottomTextView.setText("加载失败请点击重试"); holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { progressBar.setVisibility(View.VISIBLE); bottomTextView.setText("加载中"); LoadingMore(); } }); hasMore = true; break; } } else { onBindItemViewHolder(holder, position); } } protected abstract void onBindItemViewHolder(RecyclerView.ViewHolder holder, int position); @Override public int getItemViewType(int position) { if (list.size() < pageCount) { return TYPE_ITEM; } else { if (position == list.size()) { return TYPE_BOTTOM; } else { return TYPE_ITEM; } } } @Override public int getItemCount() { if (list.size() < pageCount) { hasMore = false; return list.size(); } else { return list.size() + 1; } } protected abstract void LoadingMore(); public void setErrorStatus() { loadState = STATE_ERROR; notifyItemChanged(list.size()); setLoading(false); } public void setLastedStatus() { loadState = STATE_LASTED; notifyItemChanged(list.size()); } public void addList(List addList) { int count = this.list.size(); this.list.addAll(addList); notifyItemRangeChanged(count, addList.size()); setLoading(false); } public void refreshList(List newList) { // this.list.clear(); this.list.addAll(newList); notifyDataSetChanged(); } public class BottomViewHolder extends RecyclerView.ViewHolder { TextView bottomTextView; ProgressBar progressBar; public BottomViewHolder(View itemView) { super(itemView); bottomTextView = (TextView) itemView.findViewById(R.id.bottom_title); progressBar = (ProgressBar) itemView.findViewById(R.id.progress); } } public void setPageCount(int pageCount) { this.pageCount = pageCount; } public int getPageCount() { return pageCount; } public boolean isHasMore() { return hasMore; } public void setHasMore(boolean hasMore) { this.hasMore = hasMore; } public boolean isLoading() { return isLoading; } public void setLoading(boolean loading) { isLoading = loading; } }
3.加载更多处理
public class LoadMoreScrollListener extends RecyclerView.OnScrollListener { private RecyclerView recyclerView; public LoadMoreScrollListener(RecyclerView recyclerView) { this.recyclerView = recyclerView; } @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); RecyclerView.LayoutManager manager = recyclerView.getLayoutManager(); BaseLoadAdapter adapter = (BaseLoadAdapter) recyclerView.getAdapter(); if (null == manager) { throw new RuntimeException("you should call setLayoutManager() first!!"); } if(manager instanceof LinearLayoutManager){ int lastVisibleItemPosition = ((LinearLayoutManager) manager).findLastVisibleItemPosition(); Log.v("dyp","lastVisibleItemPosition:"+lastVisibleItemPosition+",adapter.getItemCount()-1 :"+ (adapter.getItemCount()-1) +",hasMore:"+adapter.hasMore); if(adapter.hasMore && adapter.getItemCount() > adapter.getPageCount() && adapter.getItemCount()-1 == lastVisibleItemPosition){ if(!adapter.isLoading()){ adapter.LoadingMore(); } } } } }
4.条目点击处理
public interface OnRecyclerViewClickListener { void onItemClickListener(View view); void onItemLongClickListener(View view); }
5.定义bean
public class PersonBean { private String name; private String email; public PersonBean(String name, String email) { this.name = name; this.email = email; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } @Override public String toString() { return "PersonBean{" + "name='" + name + '\'' + ", email='" + email + '\'' + '}'; } }
6.activity处理
public class MainActivity extends AppCompatActivity implements MainAdapter.LoadMoreListener, SwipeRefreshLayout.OnRefreshListener ,OnRecyclerViewClickListener { List<PersonBean> list = new ArrayList<>(); RecyclerView recyclerView; MainAdapter adapter; SwipeRefreshLayout layout; Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { switch (msg.what){ case 1: adapter.setErrorStatus(); break; case 2: adapter.setLastedStatus(); break; case 3: List<PersonBean> list = new ArrayList<>(); for (int i = 0; i < 10; i++) { list.add(new PersonBean("mm"+i,"稳"+i)); } adapter.addList(list); break; } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); recyclerView = (RecyclerView) findViewById(R.id.recycle_view); layout = (SwipeRefreshLayout) findViewById(R.id.swipe); layout.setOnRefreshListener(this); layout.setRefreshing(false); for (int i = 0; i < 10; i++) { list.add(new PersonBean("mm"+i,"稳"+i)); } adapter = new MainAdapter(this,list,this); recyclerView.setLayoutManager(new LinearLayoutManager(this)); recyclerView.setOnScrollListener(new LoadMoreScrollListener(recyclerView)); recyclerView.setAdapter(adapter); adapter.setItemClickListener(this); } @Override public void loadMoreData() { if(adapter.isLoading()){ return; } adapter.setLoading(true); Random random = new Random(); int randomInt = random.nextInt(3)+1; Log.v("dyp","random:"+randomInt); if(randomInt == 1){ handler.sendEmptyMessageDelayed(1,3000); }else if(randomInt == 2){ handler.sendEmptyMessageDelayed(2,3000); }else{ handler.sendEmptyMessageDelayed(3,3000); } } @Override public void onRefresh() { if(adapter!=null){ if(null!=list){//清除预留的数据 list.clear(); } for (int i = 0; i < 10; i++) { list.add(new PersonBean("nn"+i,"稳"+i)); } if(null != list){ layout.setRefreshing(false); adapter.refreshList(list); } } } @Override public void onItemClickListener(View view) { int position = recyclerView.getChildAdapterPosition(view); PersonBean personBean = adapter.list.get(position); } @Override public void onItemLongClickListener(View view) { } }
7.mainAdapter处理
public class MainAdapter extends BaseLoadAdapter<PersonBean> { Context context; LoadMoreListener listener; public MainAdapter(Context context, List<PersonBean> list, LoadMoreListener listener) { this.context = context; this.list = list; this.listener = listener; } @Override protected RecyclerView.ViewHolder setItemViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(context).inflate(R.layout.main_item_layout, parent, false); view.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { itemListener.onItemClickListener(v);//条目的点击事件 } }); view.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { itemListener.onItemLongClickListener(v);//条目的长按事件 return true; } }); return new MainViewHolder(view); } @Override protected void onBindItemViewHolder(RecyclerView.ViewHolder holder, int position) { ((MainViewHolder) holder).nameText.setText(list.get(position).getName()); ((MainViewHolder) holder).typeText.setText(list.get(position).getEmail()); } @Override protected void LoadingMore() { if (listener == null) { return; } listener.loadMoreData(); } static class MainViewHolder extends RecyclerView.ViewHolder { TextView nameText; TextView typeText; public MainViewHolder(View itemView) { super(itemView); nameText = (TextView) itemView.findViewById(R.id.name); typeText = (TextView) itemView.findViewById(R.id.type); } } public interface LoadMoreListener { void loadMoreData(); } //recycleview条目的点击事件 private OnRecyclerViewClickListener itemListener; public void setItemClickListener(OnRecyclerViewClickListener itemClickListener) { itemListener = itemClickListener; } }