以前在实现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方法实现,让请求的内容和赋值的内容一致,如果这里不这样做就会出现空指针异常。