Serializable在recyclerview中的实现

以前在实现recyclerview的时候,一般会有如下文件:

实体类(1个内容实体类,1个网络请求实体类)、适配器、activity

代码会比较多。。

后面再师傅的带领下,发现了一种比较好的解决方法,就是用Serializable。这样代码会简洁很多,而且不在需要在activity里面实例化内容实体类。

大致思路:将网络请求实体类序列化,然后在适配器中控件赋值时调用网络请求实体类中的get方法将值赋值给控件,最后在适配器中书写一个setTOM方法,该方法有有形数 是网络请求实体类的变量,方法做的事情是将所有数据都添加到集合中去,后面在activity中调用这个setTOM方法,将请求网络实体类传入其参数中实现两者之间的绑定。

这里使用的是rxjava+retorfit的方法来请求网络。关键代码如下:

一个网络请求实体类:(里面和平时的实体类没有什么区别,只是继承了Serializable而已)


import java.io.Serializable;
import java.util.List;

public class UCardList implements Serializable {
    private List<DataListBean> dataList;

    public List<DataListBean> getDataList() {
        return dataList;
    }

    public void setDataList(List<DataListBean> dataList) {
        this.dataList = dataList;
    }

    public static class DataListBean implements Serializable {
        /**
         * slogan2 : 信用
         * cardId : 1
         * name : 浦发银行信用卡
         * logo : http://borrow-logo.oss-cn-shenzhen.aliyuncs.com/card-logo/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20181101102005.png
         * slogan : 浦发
         * url : http://www.qichangkeji.vip/gongzhonghaoWeb/page/cardAction.html?id=26&userId=120784&otherId=0
         */

        private String slogan2;
        private int cardId;
        private String name;
        private String logo;
        private String slogan;
        private String url;

        public String getSlogan2() {
            return slogan2;
        }

        public void setSlogan2(String slogan2) {
            this.slogan2 = slogan2;
        }

        public int getCardId() {
            return cardId;
        }

        public void setCardId(int cardId) {
            this.cardId = cardId;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getLogo() {
            return logo;
        }

        public void setLogo(String logo) {
            this.logo = logo;
        }

        public String getSlogan() {
            return slogan;
        }

        public void setSlogan(String slogan) {
            this.slogan = slogan;
        }

        public String getUrl() {
            return url;
        }

        public void setUrl(String url) {
            this.url = url;
        }
    }
}

一个适配器,给控件赋值的时候调用上面实体类中的内部类DataListBean中变量的set和get方法。其中有一个setTOM方法,他的作用是将所有东西都设置到集合中去,方便后面activity中调用


import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;

import com.example.administrator.referone.R;
import com.example.administrator.referone.base.BaseObserver;
import com.example.administrator.referone.base.BaseResponse;
import com.example.administrator.referone.model.LoanApi;
import com.example.administrator.referone.model.rxbean.UCardList;
import com.example.administrator.referone.util.Contstant;
import com.example.administrator.referone.util.GlideUtils;
import com.example.administrator.referone.util.IntentUtil;
import com.example.administrator.referone.util.SharedUtils;

import java.util.ArrayList;
import java.util.List;

import butterknife.BindView;
import butterknife.ButterKnife;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;

public class CardAdapter extends RecyclerView.Adapter<CardAdapter.RemoveId> {

    private List<UCardList.DataListBean> TOM=new ArrayList<>();


    public void setTOM(List<UCardList.DataListBean> TOM) {
        if (TOM!=null){
            this.TOM.clear();
            this.TOM.addAll(TOM);
        }
        notifyDataSetChanged();
    }

    @Override
    public RemoveId onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recyclerview_card, parent, false);
        RemoveId removeId = new RemoveId(view);
        return removeId;
    }

    @Override
    public void onBindViewHolder(RemoveId holder, int position) {
        final UCardList.DataListBean bean = TOM.get(position);
        GlideUtils.loadUrl(bean.getLogo(),holder.cardImg);
        holder.cardName.setText(bean.getName());
        holder.cardExtract.setText(bean.getSlogan2());
        holder.cardState.setText(bean.getSlogan());
        final BaseObserver<BaseResponse<Object>> observer1=new BaseObserver<BaseResponse<Object>>() {
            @Override
            public void onNext(BaseResponse<Object> objectBaseResponse) {
                IntentUtil.toWeb(bean.getUrl());
            }
        };

        holder.cardRelative.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                    LoanApi.Factory.create()
                            .addCardRecord(bean.getCardId()+"",SharedUtils.id,Contstant.USE_PLATFORM,Contstant.USE_CHANNEL)
                            .subscribeOn(Schedulers.io())
                            .unsubscribeOn(Schedulers.io())
                            .observeOn(AndroidSchedulers.mainThread())
                            .subscribe(observer1);

            }
        });
    }

    @Override
    public int getItemCount() {
        return TOM.size();
    }

    class RemoveId extends RecyclerView.ViewHolder {
        @BindView(R.id.card_img)
        ImageView cardImg;
        @BindView(R.id.card_name)
        TextView cardName;
        @BindView(R.id.card_extract)
        TextView cardExtract;
        @BindView(R.id.card_state)
        TextView cardState;
        @BindView(R.id.card_relative)
        RelativeLayout cardRelative;
        public RemoveId(View itemView) {
            super(itemView);
            ButterKnife.bind(this,itemView);
        }
    }


}

在activity中


import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.RelativeLayout;

import com.example.administrator.referone.R;
import com.example.administrator.referone.base.BaseActivity;
import com.example.administrator.referone.base.BaseObserver;
import com.example.administrator.referone.base.BasePresenter;
import com.example.administrator.referone.base.BaseResponse;
import com.example.administrator.referone.model.LoanApi;
import com.example.administrator.referone.model.rxbean.UCardList;
import com.example.administrator.referone.page.homepage.adapter.CardAdapter;
import com.example.administrator.referone.page.homepage.adapter.CardBean;
import com.example.administrator.referone.page.login.activity.LoginActivity;
import com.example.administrator.referone.util.Contstant;
import com.example.administrator.referone.util.IntentUtil;
import com.example.administrator.referone.util.SharedUtils;
import com.example.administrator.referone.widget.TitleView;

import java.util.ArrayList;
import java.util.List;

import butterknife.BindView;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;

public class CardActivity extends BaseActivity {

    @BindView(R.id.recyclerview_card_list)
    RecyclerView recyclerView;
    @BindView(R.id.title_view)
    TitleView titleView;

    private CardAdapter adapter;

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

    @Override
    public void initView(Bundle bundle) {
        titleView.setTitleCotent(R.string.title_card);
        if (!SharedUtils.token.equals("")) {
            initDa();
            LinearLayoutManager manager = new LinearLayoutManager(this);
            adapter = new CardAdapter();
            recyclerView.setLayoutManager(manager);
            recyclerView.setAdapter(adapter);
        }else{
            final AlertDialog alertDialog = new AlertDialog.Builder(this)
                    .setTitle("温馨提示")
                    .setMessage("想继续查看详细详细,请先登录!")
                    .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            finish();
                        }
                    })
                    .setPositiveButton("去登录", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            IntentUtil.initIntent2(LoginActivity.class);
                        }
                    })
                    .show();
        }
    }



    @Override
    public void initData() {

    }

    private void initDa(){
        BaseObserver<BaseResponse<UCardList>> observer=new BaseObserver<BaseResponse<UCardList>>() {
            @Override
            public void onNext(BaseResponse<UCardList> uCardListBaseResponse) {
                if (uCardListBaseResponse.getCode().equals(Contstant.RESPONSE_CODE_ONE)){
                    adapter.setTOM(uCardListBaseResponse.getData().getDataList());
                }
            }
        };
        LoanApi.Factory.create()
                .getCardList()
                .subscribeOn(Schedulers.io())
                .unsubscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(observer);

    }

    @Override
    public BasePresenter initPresenter() {
        return null;
    }
}

关键代码如下:

adapter.setTOM(uCardListBaseResponse.getData().getDataList());

他将adapter中的setTOM方法实现,让请求的内容和赋值的内容一致,如果这里不这样做就会出现空指针异常。

发布了29 篇原创文章 · 获赞 44 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/ai1362425349/article/details/84562595