关于对象之间相互赋值的问题

介绍:我在往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...
结语:
好了,这篇文章到这里就结束了,可能有些地方说的不太标准,欢迎指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值