Реализация BindingAdapter вне класса, который расширен от BaseObservable - PullRequest
0 голосов
/ 13 апреля 2019

im my User class У меня есть один 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 или эту модель ViewModel, такую ​​как User

мой 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);
    }
}

1 Ответ

0 голосов
/ 19 апреля 2019

Я думаю, что лучший способ для добавления адаптера привязки - добавление адаптера в класс, как то, что вы делаете, и тогда единственное, что вы должны сделать, - это расширить модель этим классом

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 адаптер

...