1. 程式人生 > >安卓下拉刷新和上拉加載的具體實例

安卓下拉刷新和上拉加載的具體實例

.get ora api測試 getwidth rem image rap posit span

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

否則會報錯,一個坑把。

比較全面的一個例子了

安卓下拉刷新和上拉加載的具體實例