Android项目okhttp请求+RecyclerView展示

准备阶段:
1.网络请求使用okhttp:

compile'xyz.reginer.http:httplib:1.0.4'

2.界面展示使用RecyclerView:

compile 'xyz.reginer.baseadapter:baseadapter:1.1.2'
compile 'com.android.support:recyclerview-v7:25.0.0'

3.数据传递使用EventBus:

compile 'org.greenrobot:eventbus:3.0.0'

4.解析json使用Gson:

compile 'com.google.code.gson:gson:2.8.0'

5.图片展示使用Glide:

compile 'com.github.bumptech.glide:glide:3.7.0'

开始撸代码:
1.使用RHttp请求网络数据并使用Gson解析同时使用EventBus传递数据:

public static void getJson() {
        RHttp.get().url("http://www.reginer.xyz/json/").build().execute(new BaseCallBack<Content>(Content.class) {
            @Override
            public void onError(Call call, Exception e, int id) {

            }

            @Override
            public void onResponse(Content response, int id) {
                EventBus.getDefault().post(response);
            }
        });
    }

如若携带参数可.params()或者.addParams()添加。

2.在BaseCallBack中解析json:

public abstract class BaseCallBack<T> extends Callback<T> {
    private Class<T> clazz;

    protected BaseCallBack(Class<T> clazz) {
        this.clazz = clazz;
    }

    @Override
    public T parseNetworkResponse(Response response, int id) throws Exception {
        String string = response.body().string();
        return json2Bean(string, clazz);
    }

    /**
     * 将json映射成bean对象
     *
     * @param result
     *            json字符串
     * @param clazz
     *            bean对象字节码
     */
    private static  <T> T json2Bean(String result, Class<T> clazz) {
        if (TextUtils.isEmpty(result))
            return null;
        Gson gs = new Gson();
        return gs.fromJson(result, clazz);
    }
}

3.创建adapter继承自CommonRvAdapter。

public class ContentAdapter extends CommonRvAdapter<Content.ItemBean>{

    public ContentAdapter(Context context, int layoutResId, List<Content.ItemBean> data) {
        super(context, layoutResId, data);
    }

    @Override
    public void convert(BaseAdapterHelper helper, Content.ItemBean item, int position) {

    }
}

如若根据item的不同类型显示不同布局,可重写getLayoutResId方法:

@Override
    public int getLayoutResId(Content.ItemBean item, int position) {
        switch (item.getType()) {
            case 1:
                return R.layout.view_type1_layout;
            case 2:
                return R.layout.view_type2_layout;
        }

        return 0;
    }

在convert方法中设置控件内容:

@Override
    public void convert(BaseAdapterHelper helper, Content.ItemBean item, int position) {
        switch (item.getType()) {
            case 1:
                Glide.with(helper.getView().getContext()).load(item.getImage()).
                        centerCrop().crossFade().into((ImageView) helper.getView(R.id.iv_content));
                helper.setText(R.id.tv_content, item.getName());
                break;
            case 2:
                helper.setText(R.id.tv_content, item.getName());
                helper.setText(R.id.tv_description, item.getDescription());

                break;

        }
    }

4.在activity中初始化控件:

private void initView() {
        mList = new ArrayList<>();
        mAdapter = new ContentAdapter(this,-1,mList);
        RecyclerView mRvContent = (RecyclerView) findViewById(R.id.rv_content);
        mRvContent.setLayoutManager(new LinearLayoutManager(this));
        //设置分割线
        mRvContent.addItemDecoration(new DividerItemDecoration(this, LinearLayoutManager.VERTICAL));
        mRvContent.setAdapter(mAdapter);
    }

注册EventBus:
在onCreate中

EventBus.getDefault().register(this);

在onDestroy中

EventBus.getDefault().unregister(this);

或者在onStart(),onStop()中。

获取EventBus返回值,刷新Adapter:

@Subscribe(threadMode = ThreadMode.MAIN)
    public void getContent(Content content) {
         if (content.getCode()==200){
             mList.addAll(content.getItem());
             mAdapter.notifyDataSetChanged();
         }
    }

开始请求数据:

NetManager.getJson();

效果图:
效果图

添加item点击事件:

mAdapter.setOnItemClickListener(this);
@Override
    public void onItemClick(RecyclerView.ViewHolder viewHolder, View view, int position) {
        Toast.makeText(this,"position is::"+position,Toast.LENGTH_SHORT).show();
    }

添加item子项控件点击事件:
在Adapter的convert方法内添加:

setOnItemChildClickListener(helper,position,R.id.iv_content,R.id.tv_content);

Activity中添加:

mAdapter.setOnItemChildClickListener(this);
@Override
    public void onChildClick(View v, int position) {
        switch (v.getId()) {
                case R.id.iv_content:
                    Toast.makeText(this,"picture position is::"+position,Toast.LENGTH_SHORT).show();
                    break;

                default:
                    Toast.makeText(this,"child position is::"+position,Toast.LENGTH_SHORT).show();
                    break;
                }
    }

源码在这里

————————完结——————————

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值