1.配置
//下拉刷新,上拉加载更多
api 'com.cjj.materialrefeshlayout:library:1.3.0'
2.先上项目图
3. DividerItemDecoration
public class DividerItemDecoration extends RecyclerView.ItemDecoration { private static final int[] ATTRS = new int[]{ android.R.attr.listDivider }; public static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL; public static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL; private Drawable mDivider; private int mOrientation; public DividerItemDecoration(Context context, int orientation) { final TypedArray a = context.obtainStyledAttributes(ATTRS); mDivider = a.getDrawable(0); a.recycle(); setOrientation(orientation); } public void setOrientation(int orientation) { if (orientation != HORIZONTAL_LIST && orientation != VERTICAL_LIST) { throw new IllegalArgumentException("invalid orientation"); } mOrientation = orientation; } @Override public void onDraw(Canvas c, RecyclerView parent) { // Log.v("recyclerview - itemdecoration", "onDraw()"); if (mOrientation == VERTICAL_LIST) { drawVertical(c, parent); } else { drawHorizontal(c, parent); } } public void drawVertical(Canvas c, RecyclerView parent) { final int left = parent.getPaddingLeft(); final int right = parent.getWidth() - parent.getPaddingRight(); final int childCount = parent.getChildCount(); for (int i = 0; i < childCount; i++) { final View child = parent.getChildAt(i); android.support.v7.widget.RecyclerView v = new android.support.v7.widget.RecyclerView(parent.getContext()); final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child .getLayoutParams(); final int top = child.getBottom() + params.bottomMargin; final int bottom = top + mDivider.getIntrinsicHeight(); mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); } } public void drawHorizontal(Canvas c, RecyclerView parent) { final int top = parent.getPaddingTop(); final int bottom = parent.getHeight() - parent.getPaddingBottom(); final int childCount = parent.getChildCount(); for (int i = 0; i < childCount; i++) { final View child = parent.getChildAt(i); final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child .getLayoutParams(); final int left = child.getRight() + params.rightMargin; final int right = left + mDivider.getIntrinsicHeight(); mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); } } @Override public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) { if (mOrientation == VERTICAL_LIST) { outRect.set(0, 0, 0, mDivider.getIntrinsicHeight()); } else { outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0); } } }
MainActivity
public class MainActivity extends AppCompatActivity { private OkHttpHelper httpHelper =OkHttpHelper.getInstance(); private SwipeRefreshLayout swipeRefreshLayout; @ViewInject(R.id.tv) private TextView tv; private RecyclerView mRecyclerView; private ArrayList<String> mDatas=new ArrayList<>(); private MaterialRefreshLayout materialRefreshLayout; private static final int STATE_NORMAL=0; private static final int STATE_REFRESH=1; private static final int STATE_MORE=2; private int state = STATE_NORMAL; private List<PayBean.Data> mData; private int page=1; private int pagesize=20; private int totalpages=0; private PayAdapter payAdapter; private static final String TAG = "MainActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mRecyclerView = findViewById(R.id.recycleview); materialRefreshLayout =findViewById(R.id.refresh); initRefreshLayout(); getData(); } private void initRefreshLayout(){ materialRefreshLayout.setLoadMore(true); materialRefreshLayout.setMaterialRefreshListener(new MaterialRefreshListener() { @Override public void onRefresh(MaterialRefreshLayout materialRefreshLayout) { refreshData(); } @Override public void onRefreshLoadMore(MaterialRefreshLayout materialRefreshLayout) { if(page<=totalpages){ loadMoreData(); }else{ Toast.makeText(MyApplication.getContext(),"没有更多内容了",Toast.LENGTH_SHORT).show(); materialRefreshLayout.finishRefreshLoadMore(); } } }); } private void loadMoreData(){ page=++page; state=STATE_MORE; getData(); } private void refreshData(){ page=1; state=STATE_REFRESH; getData(); } private void getData(){ String url=Api.BASE_URL+"&page="+page+"&pagesize="+pagesize; httpHelper.get(url, new BaseHttpCallback() { @Override public void onRequestBefore(Request request) { } @Override public void onSuccess(Response response, String string) { PayBean payBean =JSON.parseObject(string,PayBean.class); page= payBean.getPageindex(); totalpages =payBean.getTotalpages(); mData = payBean.getData(); showData(); } @Override public void onError(Response response, int code, Exception e) { } @Override public void onFailure(Exception e) { } }); } private void showData(){ switch (state){ case STATE_NORMAL: payAdapter = new PayAdapter(mData); mRecyclerView.setAdapter(payAdapter); mRecyclerView.setLayoutManager(new LinearLayoutManager(MyApplication.getContext())); break; case STATE_REFRESH: payAdapter.clearData(); payAdapter.addData(0,mData); mRecyclerView.scrollToPosition(0); materialRefreshLayout.finishRefresh(); break; case STATE_MORE: payAdapter.addData(payAdapter.getmData().size(),mData); mRecyclerView.scrollToPosition(payAdapter.getmData().size()); materialRefreshLayout.finishRefreshLoadMore(); break; default: break; } } }
MyApplication
public class MyApplication extends Application{ private static Context context; @Override public void onCreate() { super.onCreate(); Fresco.initialize(this); context =this; } public static Context getContext(){ return context; } }
PayAdapter
public class PayAdapter extends RecyclerView.Adapter<PayAdapter.ViewHolder> { private List<PayBean.Data> mData; public OnItemClickListener mListener; public void setOnItemClickListener(OnItemClickListener listener){ mListener=listener; } public PayAdapter(List<PayBean.Data> data){ mData=data; } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.view_rv_item,null,false); ViewHolder viewHolder = new ViewHolder(view); return viewHolder; } @Override public void onBindViewHolder(ViewHolder holder, int position) { PayBean.Data payBean=mData.get(position); holder.tv_id.setText(payBean.getId()); holder.tv_openid.setText(payBean.getOpenid()); } @Override public int getItemCount() { if(mData!=null && mData.size()>0){ return mData.size(); } return 0; } class ViewHolder extends RecyclerView.ViewHolder{ TextView tv_id; TextView tv_openid; LinearLayout item_layout; public ViewHolder(View itemView) { super(itemView); tv_id =(TextView) itemView.findViewById(R.id.tv_id); tv_openid =(TextView) itemView.findViewById(R.id.tv_openid); } } public List<PayBean.Data> getmData() { return mData; } public interface OnItemClickListener{ void OnClick(View view,int position,int id); } public void clearData(){ if(mData.size()>0 && mData!=null){ int presize= mData.size(); mData.clear(); notifyItemRangeRemoved(0,presize); } } public void addData(int position,List<PayBean.Data> datas){ if (datas!=null && datas.size()>0){ mData.addAll(datas); notifyItemRangeInserted(position,mData.size()); } } public void removeData(){ } }
public class PayBean { public String result; public int pageindex; public int pagesize; public int totalrows; public int totalpages; public List<Data> data; public class Data { public String id; public String openid; public String getId() { return id; } public String getOpenid() { return openid; } } public int getTotalrows() { return totalrows; } public int getPageindex() { return pageindex; } public String getResult() { return result; } public List<Data> getData() { return data; } public int getTotalpages() { return totalpages; } public int getPagesize() { return pagesize; } }
main_activity
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:fresco="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <com.cjj.MaterialRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/refresh" android:layout_width="match_parent" android:layout_height="match_parent" app:wave_height_type="normal" app:isLoadMore="true" app:overlay="true" app:wave_show="true" > <android.support.v7.widget.RecyclerView android:id="@+id/recycleview" android:scrollbars="vertical" android:layout_width="match_parent" android:layout_height="match_parent"/> </com.cjj.MaterialRefreshLayout> <TextView android:id="@+id/tv" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>
layout_item
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="45dp"> <LinearLayout android:id="@+id/item_layout" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:id="@+id/tv_id" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/tv_openid" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> </LinearLayout>
public class Api { public static final String BASE_URL="xxxxx"; }
弄一个可以传page和pagesize的api测试即可
遇到的问题,adapter清空的时候,要执行
notifyItemRangeRemoved(0,presize);
否则会报错,一个坑把。
比较全面的一个例子了