dkzwm / SmoothRefreshLayout

一款支持上下拉刷新、越界回弹、二级刷新、横向刷新、拉伸回弹、平滑滚动、嵌套滚动的多功能刷新控件
MIT License
1.3k stars 218 forks source link

关于下拉刷新和上拉加载结合RecycleView的应用问题。 #18

Closed dpc761218914 closed 7 years ago

dpc761218914 commented 7 years ago

项目已star

不知为何上拉加载更多为何每次都会执行两次? 其中if里面是下拉刷新吧?而else里面执行加载更多吧??

抱歉,不知为何github不能格式化代码···

mRefreshLayout.setOnRefreshListener(new RefreshingListenerAdapter() { @Override public void onRefreshBegin(final boolean isRefresh) { mHandler.postDelayed(new Runnable() { @Override public void run() { //下拉刷新 if (isRefresh) { Toast.makeText(Main2Activity.this,"下拉刷新~~~",Toast.LENGTH_SHORT).show(); initData(); page=page+1; //加载更多 } else { Toast.makeText(Main2Activity.this,"上拉加载更多"+page,Toast.LENGTH_SHORT).show(); //获取更多数据 getMoreData(); page=page+1; } mRefreshLayout.refreshComplete(); } }, 1000); } }); mRefreshLayout.autoRefresh(false); }

dkzwm commented 7 years ago

@dpc761218914 能麻烦完整贴下配置代码吗,这边从这点配置无法看出是否是库有BUG。 代码格式化需要3个“`”开始,中间放代码,3个“`”结束。这样代码就能正常格式化显示了。

dpc761218914 commented 7 years ago

代码格式化忘记了,感谢提醒,具体代码如下,就是通过recycleView分页加载数据~,使用okhttp访问网络,post的招聘类型city和页数page分页获取数据~

package com.syjob.jx;

import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.os.Handler;
import android.support.design.widget.NavigationView;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;

import com.lzy.okgo.OkGo;
import com.lzy.okgo.callback.StringCallback;
import com.syjob.adapter.JobAdapter;
import com.syjob.api.Api;
import com.syjob.bean.JxJob;
import com.syjob.bean.JxJobRecord;
import com.syjob.utils.Constant;
import com.syjob.utils.JsonUtils;

import org.json.JSONObject;

import java.util.ArrayList;
import java.util.HashMap;

import me.dkzwm.widget.srl.MaterialSmoothRefreshLayout;
import me.dkzwm.widget.srl.RefreshingListenerAdapter;
import okhttp3.Call;
import okhttp3.Response;

public class Main2Activity extends AppCompatActivity
        implements NavigationView.OnNavigationItemSelectedListener {

    private ArrayList<JxJob> datas;

    private JxJobRecord jxJobRecord;
    private RecyclerView recycler;
    private MaterialSmoothRefreshLayout mRefreshLayout;
    private JobAdapter adapter;

    private Handler mHandler = new Handler();

    //默认城市
    private String city;
    //初始化第一页
    private int page=1;

    private ProgressDialog waitingDialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        initView();
        initData();
        initEvent();

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.setDrawerListener(toggle);
        toggle.syncState();

        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);
    }

    @Override
    public void onBackPressed() {
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);
        } else {
            super.onBackPressed();
        }
    }
    private void initView(){
        waitingDialog= new ProgressDialog(Main2Activity.this);
        waitingDialog.setTitle("主人别着急");
        waitingDialog.setMessage("我正在努力加载~...");
        waitingDialog.setIndeterminate(true);
        waitingDialog.setCancelable(false);

        recycler=(RecyclerView) findViewById(R.id.line_recycler2);

        recycler.setLayoutManager(new LinearLayoutManager(this));
        recycler.setHasFixedSize(true);

        city="jiangxi";
        datas=new ArrayList<JxJob>();

        mRefreshLayout = (MaterialSmoothRefreshLayout) findViewById(R.id.smoothRefreshLayout2);
        mRefreshLayout.setDisableLoadMore(false);
        mRefreshLayout.materialStyle();
        mRefreshLayout.setEnableScrollToBottomAutoLoadMore(true);

        mRefreshLayout.setOnRefreshListener(new RefreshingListenerAdapter() {
            @Override
            public void onRefreshBegin(final boolean isRefresh) {
                mHandler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        //下拉刷新
                        if (isRefresh) {
                            Toast.makeText(Main2Activity.this,"下拉刷新~~~",Toast.LENGTH_SHORT).show();
                            initData();
                            page=page+1;
                            //加载更多
                        } else {
                            Toast.makeText(Main2Activity.this,"上拉加载更多"+page,Toast.LENGTH_SHORT).show();
                            //获取更多数据
                            getMoreData();
                            page=page+1;
                            // Toast.makeText(MainActivity.this,"加载更多",Toast.LENGTH_SHORT).show();

                        }
                        mRefreshLayout.refreshComplete();
                    }
                }, 1000);
            }
        });
        mRefreshLayout.autoRefresh(false);
    }
    /*初始化获取网络数据*/
    private void initData(){

        waitingDialog.show();

        /*构造请求体*/
        HashMap<String, String> params = new HashMap<>();
        params.put("city", city);
        params.put("page", page+"");
        JSONObject jsonObject = new JSONObject(params);

        /*获取请假记录*/
        OkGo.post(Api.get_ShiYeDanWeis)//
                .tag(this)//
                .upJson(jsonObject.toString())//
                .execute(new StringCallback() {
                    @Override
                    public void onSuccess(String s, Call call, Response response) {
                        //Toast.makeText(MainActivity.this,"测试成功",Toast.LENGTH_SHORT).show();
                        /*关闭提示框*/
                        jxJobRecord=new JxJobRecord();
                        jxJobRecord= JsonUtils.fromJson(s,JxJobRecord.class);
                        if(jxJobRecord.getStatus().equals(Constant.SUCCESS)){
                            //切换城市的时候需要先清空内容
                            if(datas.size()>0){
                                datas.clear();
                            }
                            datas.addAll(jxJobRecord.getMsg());
                            if(datas==null || datas.size()<=0){
                                Toast.makeText(Main2Activity.this,"无记录...",Toast.LENGTH_SHORT).show();
                            }else{
                                //Toast.makeText(MainActivity.this,shiYeDanWeiRecord.getMsg().size()+"",Toast.LENGTH_SHORT).show();
                                adapter.notifyDataSetChanged();
                                waitingDialog.dismiss();
                            }
                        }else{
                            Toast.makeText(Main2Activity.this,"系统错误,请稍后再试...",Toast.LENGTH_SHORT).show();
                            return;
                        }
                    }
                });
    }
    private void initEvent() {
        LinearLayoutManager mLayoutManager=new LinearLayoutManager(this);
        recycler.setLayoutManager(mLayoutManager);
        adapter=new JobAdapter(datas,Main2Activity.this);
        recycler.setAdapter(adapter);
        recycler.setItemAnimator(new DefaultItemAnimator());
    }

    /*下拉加载更多网络数据*/
    private void getMoreData(){
        waitingDialog.show();
        /*构造请求体*/
        HashMap<String, String> params = new HashMap<>();
        params.put("city", city);
        params.put("page", page+"");
        JSONObject jsonObject = new JSONObject(params);

        /*获取请假记录*/
        OkGo.post(Api.get_ShiYeDanWeis)//
                .tag(this)//
                .upJson(jsonObject.toString())//
                .execute(new StringCallback() {
                    @Override
                    public void onSuccess(String s, Call call, Response response) {
                        //Toast.makeText(MainActivity.this,"测试成功",Toast.LENGTH_SHORT).show();
                        /*关闭提示框*/
                        jxJobRecord=new JxJobRecord();
                        jxJobRecord= JsonUtils.fromJson(s,JxJobRecord.class);
                        if(jxJobRecord.getStatus().equals(Constant.SUCCESS)){
                            datas.addAll(jxJobRecord.getMsg());
                            if(datas==null || datas.size()<=0){
                                Toast.makeText(Main2Activity.this,"已经到最底层...",Toast.LENGTH_SHORT).show();
                            }else{
                                //加载数据成功后,定位到底部还没有实现
                                //Toast.makeText(MainActivity.this,shiYeDanWeiRecord.getMsg().size()+"",Toast.LENGTH_SHORT).show();
                                adapter.notifyDataSetChanged();
                                //adapter.notifyItemInserted(datas.size());
                                //recycler.smoothScrollToPosition(datas.size()-11);
                                waitingDialog.dismiss();
                            }
                        }else{
                            Toast.makeText(Main2Activity.this,"系统错误,请稍后再试...",Toast.LENGTH_SHORT).show();
                            return;
                        }
                    }
                });
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        //四个参数的含义。1,group的id,2,item的id,3,是否排序,4,将要显示的内容
        menu.add(0,1,0,"全省");
        menu.add(0,2,0,"南昌");
        menu.add(0,3,0,"九江");
        menu.add(0,4,0,"上饶");
        menu.add(0,5,0,"萍乡");
        menu.add(0,6,0,"鹰潭");
        menu.add(0,7,0,"赣州");
        menu.add(0,8,0,"宜春");
        menu.add(0,9,0,"景德镇");
        menu.add(0,10,0,"吉安");
        menu.add(0,11,0,"抚州");
        menu.add(0,12,0,"新余");
        return true;
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        //页数需要从第一页开始算~
        page=1;
        switch (item.getItemId()){
            case 1:
                city="jiangxi";
                initData();
                break;
            case 2:
                city="nanchang";
                initData();
                break;
            case 3:
                city="jiujiang";
                initData();
                break;
            case 4:
                city="shangrao";
                initData();
                break;
            case 5:
                city="pingxiang";
                initData();
                break;
            case 6:
                city="yingtan";
                initData();
                break;
            case 7:
                city="ganzhou";
                initData();
                break;
            case 8:
                city="yichun";
                initData();
                break;
            case 9:
                city="jingdezhen";
                initData();
                break;
            case 10:
                city="jian";
                initData();
            case 11:
                city="fuzhou";
                initData();
                break;
            case 12:
                city="xinyu";
                initData();
                break;
        }
        return true;
    }

    @SuppressWarnings("StatementWithEmptyBody")
    @Override
    public boolean onNavigationItemSelected(MenuItem item) {
        // Handle navigation view item clicks here.
        int id = item.getItemId();

        if (id == R.id.nav_share) {
            Toast.makeText(Main2Activity.this,"分享APP",Toast.LENGTH_SHORT).show();
        } else if (id == R.id.nav_about) {
            Toast.makeText(Main2Activity.this,"关于我们",Toast.LENGTH_SHORT).show();
            showNormalDialog();
        }else if (id == R.id.nav_version) {
            showVersionlDialog();
        }

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);
        return true;
    }

    //弹出关于我们对话框~
    private void showNormalDialog(){
        /* @setIcon 设置对话框图标
         * @setTitle 设置对话框标题
         * @setMessage 设置对话框消息提示
         * setXXX方法返回Dialog对象,因此可以链式设置属性
         */
        final AlertDialog.Builder normalDialog =
                new AlertDialog.Builder(Main2Activity.this);
        normalDialog.setIcon(R.mipmap.logo);
        normalDialog.setTitle("关于我们");
        normalDialog.setMessage("我是不是一个还不错的江西省事业单位招聘信息APP呢?");
        normalDialog.setPositiveButton("已了解",
                new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        //...To-do
                    }
                });

        // 显示
        normalDialog.show();
    }

    //弹出版本校验对话框~
    private void showVersionlDialog(){
        /* @setIcon 设置对话框图标
         * @setTitle 设置对话框标题
         * @setMessage 设置对话框消息提示
         * setXXX方法返回Dialog对象,因此可以链式设置属性
         */
        final AlertDialog.Builder normalDialog =
                new AlertDialog.Builder(Main2Activity.this);
        normalDialog.setIcon(R.mipmap.logo);
        normalDialog.setTitle("当前版本");
        normalDialog.setMessage("江西事业单位招聘 V0.0.1");
        normalDialog.setPositiveButton("已了解",
                new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        //...To-do
                    }
                });

        // 显示
        normalDialog.show();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mHandler.removeCallbacksAndMessages(null);
    }

}
dpc761218914 commented 7 years ago

现在的问题是上拉加载更多的时候,会刷新两次~~~尴尬了

dkzwm commented 7 years ago

@dpc761218914 你应该在网络请求完成后数据更新了才refreshComplete(),代码逻辑上有点问题。

dkzwm commented 7 years ago

@dpc761218914 Demo的代码是不想接入网络请求进行的模拟数据请求,真实的应该是在onRefreshBegin(boolean isRefresh)里进行网络请求,在OKHttp的onSuccess里进行refreshComplete()

dpc761218914 commented 7 years ago

感谢,按照您的解释解决了,效果很好~ 看了一下API

refreshComplete 无参 刷新完成,且设置最后一次刷新状态为成功

不是很理解。

dkzwm commented 7 years ago

@dpc761218914 这个的意思是让RefreshLayout完成刷新,重置内部状态到初始状态以备下次手指触摸能够触发刷新。设置最后一次刷新状态为成功是表示完成刷新时是成功的,这个只是提供一个标志给刷新视图用以展示是否刷新成功用的。例如QQ的上一版本下拉刷新在刷新视图中就有刷新成功刷新失败的提示。假如网络请求成功那么可以设置为true,如果网络请求失败可以设置为false。库里集成的刷新视图中ClassicHeader是实现了这样的需求的。

dpc761218914 commented 7 years ago

好的,非常感谢~,学习了

dkzwm commented 7 years ago

@dpc761218914 没问题的话,麻烦关闭下issue,谢谢

dpc761218914 commented 7 years ago

感谢