您的位置:首页 > 理论基础 > 计算机网络

MVP+OkHttp+RecyclerView+BaseActivity

2018-03-02 10:29 363 查看
BaseActivity方法如下:
/**
 * 1. 类的用途 把公共方法抽取到基类  抽取基类+泛型
 * 2. @author forever
 * 3. @date 2018/3/1 11:38
 */

public abstract class BaseActivity<T> extends AppCompatActivity {
    //声明p 使用到泛型
    public T presenter;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //加载布局的方法每个activity都有
        setContentView(getLayoutId());
        presenter = getPresenter();
        initView();
        getData();

    }

    //加载布局的方法,返回布局id
    public abstract int getLayoutId();

    public abstract T getPresenter();

    public abstract void initView();

    public abstract void getData();

}
BasePersent方法如下:

/**
 * 1. 类的用途
 * 2. @author forever
 * 3. @date 2018/3/16 09:58
 */

public class BasePresenter<V> {
    //在父类声明v
    public V v;

    public void attachView(V v) {
        //初始化
        this.v = v;
    }

Model方法如下:
/**
 * 1. 类的用途
 * 2. @author forever
 * 3. @date 2018/3/1 11:02
 */

public class ShowModel {
    //接口回调
    private CallBackData callBackData;

    public interface CallBackData {
        void backData(ShowInfo showInfo);
    }

    public void setOnCallBackData(CallBackData callBackData) {
        this.callBackData = callBackData;
    }

    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
                case 0:
                    ShowInfo showInfo = (ShowInfo) msg.obj;

                    if (callBackData != null) {
                        callBackData.backData(showInfo);
                    }
                    break;
            }

        }
    };

    //获取数据
    public void getServerData(int page) {
        OkHttpClient okHttpClient = new OkHttpClient();
        Request request = new Request.Builder().url(Api.URL+"%E7%A6%8F%E5%88%A9/10/" + page).build();
        Call call = okHttpClient.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {

            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                String json = response.body().string();
                Gson gson = new Gson();
                ShowInfo showInfo = gson.fromJson(json, ShowInfo.class);
                //子线程中的数据回调主线程
                Message message = new Message();
                message.what = 0;
                message.obj = showInfo;
                handler.sendMessage(message);

            }
        });

    }

}

View方法如下:

public interface ShowView {
    void showData(ShowInfo showInfo);
}

presenter方法如下:

/**
 * 1. 类的用途
 * 2. @author forever
 * 3. @date 2018/3/1 11:11
 */

public class ShowPresenter extends BasePresenter<showView>{
    //声明v跟m
    ShowView showView;
    ShowModel showModel;

    //初始化view和model
    public ShowPresenter(ShowView showView) {

      //  this.showView = showView;
 //在构造方法中赋值
        // this.newsView = newsView;

        //super代表父类引用
        /**
         * 父类声明
         * 子类创建
         * 子类调用
         */

 super.attachView(showView);

        showModel = new ShowModel();
    }

    //将p跟m关联
    public void relevance(int page) {
        showModel.getServerData(page);
        //回调数据
        showModel.setOnCallBackData(new ShowModel.CallBackData() {
            @Override
            public void backData(ShowInfo showInfo) {
                  //v在父类声明
                v.showData(showInfo);
            }
        });
    }

}
MainActivity方法如下:
public class MainActivity extends BaseActivity<ShowPresenter> implements ShowView {

    private SwipyRefreshLayout srl;
    private RecyclerView rv;
    private int page = 1;
    private Handler handler = null;
    private List<ShowInfo.ResultsBean> lists = null;

   /* @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //将p跟v关联起来
        *//*ShowPresenter showPresenter = new ShowPresenter(this);
        showPresenter.relevance(page);*//*
    }*/

    @Override
    public int getLayoutId() {
        return R.layout.activity_main;
    }

    @Override
    public ShowPresenter getPresenter() {
        //实例化 同时关联p跟v
        presenter = new ShowPresenter(this);

        return presenter;
    }

    @Override
    public void initView() {
        handler = new Handler();

        srl = (SwipyRefreshLayout) findViewById(R.id.srl);
        rv = (RecyclerView) findViewById(R.id.rv);
        GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 2);
        rv.setLayoutManager(gridLayoutManager);
        //设置刷新效果的颜色
        srl.setColorSchemeResources(R.color.colorAccent, R.color.colorPrimary, R.color.colorPrimaryDark, android.R.color.darker_gray);
        //设置支持下拉刷新,上拉加载
        srl.setDirection(SwipyRefreshLayoutDirection.BOTH);
        //设置刷新的监听
        srl.setOnRefreshListener(new SwipyRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh(int index) {
                page = 1;
                presenter.relevance(page);
                //延迟2秒停止刷新
                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        srl.setRefreshing(false);
                    }
                }, 2000);
            }

            @Override
            public void onLoad(int index) {
                page++;
                presenter.relevance(page);
                //延迟2秒停止刷新
                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        srl.setRefreshing(false);
                    }
                }, 2000);
            }
        });
    }

    @Override
    public void getData() {
        //默认获取第一页数据
        presenter.relevance(page);
    }

    //把数据回调view
    @Override
    public void showData(ShowInfo showInfo) {
        //把数据获取到的给适配器
        Toast.makeText(this, "数据获取成功:" + showInfo.getResults().get(0).getSource(), Toast.LENGTH_SHORT).show();

        //分页加载
        List<ShowInfo.ResultsBean> results = showInfo.getResults();
        if (page == 1) {
            //第一页的时候创建一个集合
            lists = new ArrayList<>();
        }
        //累加数据
        lists.addAll(results);
        ShowAdapter adapter = new ShowAdapter(this, lists);
        rv.setAdapter(adapter);

    }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: