代码之家  ›  专栏  ›  技术社区  ›  DolDurma

Android在类外实现BindingAdapter,它从BaseObservable扩展而来

  •  0
  • DolDurma  · 技术社区  · 7 年前

    我是我的 User 我有一个 BindingAdapter 它叫什么名字 loadImage 这很好

    class User : BaseObservable() {
        var username: String? = null
        var password: String? = null
        var profilePicUrl: String? = null
    
        companion object {
            @BindingAdapter("android:profilePicUrl")
            fun loadImage(view: ImageView, imageUrl: String) {
                Picasso.get().load(imageUrl).into(view)
            }
        }
    }
    

    现在,由于我有更多类似的函数,我想在其他类上使用它们,例如:

    object BindingAdapters {
        @JvmStatic
        @BindingAdapter("android:profilePicUrl")
        fun loadImage(view: ImageView, imageUrl: String) {
            Picasso.get().load(imageUrl).into(view)
        }
    }
    

    我的问题是我不能把这门课当作 BindingAdapters 在…上 Activity 或者这个活动视图模型,比如 使用者

    我的 LoginActivity 课程:

    class LoginActivity : AppCompatActivity(), LoginResultCallbacks {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            val binding: LoginActivityBinding = DataBindingUtil.setContentView(this, R.layout.login_activity)
            binding.viewModel = ViewModelProviders.of(this, LoginViewModelFactory(this)).get(LoginViewModel::class.java)
    
        }
    
        ...
    }
    

    LoginViewModel 课程:

    public class LoginViewModel extends ViewModel {
        private User user;
        private LoginResultCallbacks loginResultCallbacks;
    
        public LoginViewModel(LoginResultCallbacks loginResultCallbacks) {
            this.loginResultCallbacks = loginResultCallbacks;
            this.user = new User();
        }
    }
    

    LoginViewModelFactory

    public class LoginViewModelFactory extends ViewModelProvider.NewInstanceFactory {
        private LoginResultCallbacks loginResultCallbacks;
    
        public LoginViewModelFactory(LoginResultCallbacks loginResultCallbacks) {
            this.loginResultCallbacks = loginResultCallbacks;
        }
    
        @NonNull
        @Override
        public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
            return (T) new LoginViewModel(loginResultCallbacks);
        }
    }
    
    0 回复  |  直到 7 年前
        1
  •  0
  •   mahdi shahbazi    7 年前

    我认为添加绑定适配器的最好方法是像您所做的那样在类中添加适配器,然后您必须做的唯一一件事是您的模型扩展该类

    class BindingAdapters : ViewModel () {
        companion object {
            @BindingAdapter("android:profilePicUrl")
            fun loadImage(view: ImageView, imageUrl: String) {
                Picasso.get().load(imageUrl).into(view)
            }
        }
    }
    
    public class LoginViewModel extends BindingAdapters {
        private User user;
        private LoginResultCallbacks loginResultCallbacks;
    
        public LoginViewModel(LoginResultCallbacks loginResultCallbacks) {
            this.loginResultCallbacks = loginResultCallbacks;
            this.user = new User();
        }
    }
    

    所以每一个扩展的模型 BindingAdapters 可以使用 profilePicUrl 适配器