介绍:我在往recyclerView适配器中传入对象的问题
背景:mvp+Retrofit和RxJava。
引言:这是一个java基础级的错误,这个问题涉及了一点内存机制,veryEasy
首先看看怎么个“犯错思路”
——以下为简化过的代码——
HomeBean beforeHandHomeBean = new HomeBean();//碎片的成员变量
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
initData();//初始化数据
}
//初始化数据
private void initData() {
//beforeHandHomeBean问题的所在!
recAdapter = new RecAdapter(getActivity(),beforeHandHomeBean);//beforeHandHomeBean是预先设置的空对象
xrecView.setAdapter(recAdapter);//设置一个空适配器
presenter = new IndexPresenter(this);
presenter.getData();//获取网络数据
}
//p层返回数据的回调
@Override
public void onGetDataSuc(HomeBean homeBean) {//homebean为网络请求成功返回的新对象
beforeHandHomeBean = homebean;
recAdapter.notifyDataSetChanged();
}
如你所见,我想把homeBean中的数据赋给beforeHandHomeBean,然后刷新适配器。
但是!!这是一个错误的方法,这里就是我想说的内存机制的问题所在了。
我最开始在碎片的成员变量那new了一个beforeHandHomeBean对象,
假设在堆内存中地址是0x111,设置适配器的时候传过去的也是这个引用地址0x111
也就是说下面这个适配器的成员变量home引用的地址也是0x111
public class RecommendAdapter extends RecyclerView.Adapter {
private Context context;
private HomeBean home;
public RecommendAdapter(Context context, HomeBean home) {
this.context = context;
this.home = home;
}
}
而从p层网络请求中回调的homeBean是一个新对象,在堆内存的引用地址是0x115(说到这里应该明白了吧?)
所以我想把网络回调的homeBean对象的数据赋给beforeHandHomeBean,beforeHandHomeBean = homebean;
只是把beforeHandHomeBean的引用地址更改了而已,现在beforeHandHomeBean的引用地址是0x115
,而我刷新了适配器,适配器里的home引用地址是0x111,和beforeHandHomeBean一点关系都没有,刷新也是白刷新!
而构造器里如果传的是List就不会了,List是一个容器,里面可以有多个对象的引用,随便你怎么添加删除,所以换成List
一点毛病没有。
好了,错误总结完毕,接下来就是解决方案了:
//p层返回数据的回调
@Override
public void onGetDataSuc(HomeBean homeBean) { //homebean为网络请求成功返回的新对象
//beforeHandHomeBean = homebean; //这一行就没用了
recAdapter.setHomeBean(home); //请求网络数据刷新到适配器的正确操作
recAdapter.notifyDataSetChanged();
}
如上,一行代码搞定!
原理:
这是暴露了适配器中的homeBean成员变量的Setter方法,直接通过适配器对象.setHomeBean(homeBean);
这样就能够给适配器中0x111的对象重新赋一个地址值0x115,就可以获取到数据了
End...
结语:
好了,这篇文章到这里就结束了,可能有些地方说的不太标准,欢迎指正。