根据我在网上阅读的内容,即时通讯仍然不清楚,但这是一个示例:
@Module
public abstract class HomeModule {
@Binds
public abstract HomePresenter bindHomePresenter(HomePresenterImp
homePresenterImp);
}
Run Code Online (Sandbox Code Playgroud)
并且类定义如下所示:
public interface HomePresenter {
Observable<List<User>> loadUsers();
}
public class HomePresenterImp implements HomePresenter {
public HomePresenterImp(){
}
@Override
public Observable<List<User>> loadUsers(){
//Return user list observable
}
}
Run Code Online (Sandbox Code Playgroud)
如果我只能使用提供注释,为什么还要使用@Binds,如下所示:
@Provides
public HomePresenter provideHomePresenter() {
return new HomePresenterImp();
}
Run Code Online (Sandbox Code Playgroud)
@Binds而不是@Provides的用例是什么?如果我使用@Binds,我是否仍需要在我的appcomponent中声明它(当我使用@Binds时,它是一个抽象类)?
这就是我正在尝试做的。
ArrayList在 Fragment 内设置对象 FragmentActivity
容器内的观察者获取该数组(承载所有片段的活动)所以,我所做的是以下。
首先,我SharedViewModel从我将设置的位置创建并从中获取数据:
class SharedViewModel: ViewModel() {
var personArrayObj:MutableLiveData<ArrayList<Person>> = MutableLiveData()
fun setPersonArray(personArray:ArrayList<Person>){
personArrayObj.value = personArray
}
val getPersonArray:LiveData<ArrayList<Person>>
get() = personArrayObj
}
Run Code Online (Sandbox Code Playgroud)
现在,我ViewModel在MainActivity承载所有片段创建的内部实例化它,因此,我可以ArrayData从任何 Fragment 集合中获取它:
class MainActivity: FragmentActivity(){
private lateinit var viewModel:SharedViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
viewModel = ViewModelProviders.of(this).get(SharedViewModel::class.java)
viewModel.getPersonArray.observe(this, Observer { it:ArrayList<Person>
Log.d("Array:",""+it)
})
}
}
Run Code Online (Sandbox Code Playgroud)
然后我需要做的最后一件事是从我想要的任何 Fragment 设置该 Array 的值,然后如果该值发生更改,将触发主机 Activity,因此,要做到这一点,我只需viewModel.setValue(personArray)在我想要的Fragment 上做一个.