• 安卓下拉刷新和上拉加载的具体实例


    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);

     否则会报错,一个坑把。

    比较全面的一个例子了

  • 相关阅读:
    2020.10.10收获(动手动脑三)
    2020.10.8收获
    2020.10.4收获
    2020.10.11收获
    2020.10.6收获
    2020.10.7收获(动手动脑二)
    2020.10.9收获
    2020.10.3收获
    2020.10.2收获
    2020.10.5收获
  • 原文地址:https://www.cnblogs.com/norm/p/8278626.html
Copyright © 2020-2023  润新知