Можно ли сделать 2 или более DataBindingComponent? - PullRequest
0 голосов
/ 21 сентября 2018

Я хотел бы спросить, возможно ли сделать 2 или более класса DataBindingComponent в Android?потому что я хочу избежать статического метода в привязке, поэтому я пытаюсь использовать инъекцию с DataBindingComponent, но я получил ошибку Класс 'AppDataBindingComponent' должен быть либо объявлен абстрактным, либо реализовать абстрактный метод 'getLoginViewDataBinding' в 'DataBindingComponent' из-за этой ошибки я не могу сделать нестатическую.

это класс, с которым у меня возникла проблема

public class AppDataBindingComponent implements android.databinding.DataBindingComponent {
    @Override
    public RecyclerViewDataBinding getRecyclerViewDataBinding() {
        return new RecyclerViewDataBinding();
    }
}

Первый класс связывания

public class RecyclerViewDataBinding {

    @BindingAdapter({"app:adapter", "app:data"})
    public void bind(RecyclerView recyclerView, DataAdapter adapter, List<DataModel> data) {
        recyclerView.setAdapter(adapter);
        adapter.updateData(data);
    }
}

Второй класс привязки

public class LoginViewDataBinding {

    @BindingAdapter({"validation", "errorMsg"})
    public void setErrorEnable(TextInputLayout textInputLayout, StringRule stringRule,
                                      final String errorMsg) {
        Observable<CharSequence> textObservable = RxTextView.textChanges(
                Objects.requireNonNull(textInputLayout.getEditText()));
        compositeDisposable.add(textObservable
                .map(charSequence -> {
                    ......
                })
                .distinctUntilChanged()
                .replay(1).refCount()
                .subscribe());
    }

}

В основном классе я вызываю DataBindingComponent

public class MainActivity extends AppCompatActivity {
    private DataViewModel dataViewModel;
    private ActivityMainListMvvmBinding activityBinding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        bind();
    }

    private View bind() {
        activityBinding = DataBindingUtil
                .setContentView(this, R.layout.activity_main_list_mvvm, new AppDataBindingComponent());
        dataViewModel = new DataViewModel();
        activityBinding.setViewModel(dataViewModel);
        return activityBinding.getRoot();
    }

}

Проблема решается, если я поставлю getLoginViewDataBinding

public class AppDataBindingComponent implements android.databinding.DataBindingComponent {
    @Override
    public RecyclerViewDataBinding getRecyclerViewDataBinding() {
        return new RecyclerViewDataBinding();
    }

    @Override
    public LoginViewDataBinding getLoginViewDataBinding() {
        return null;
    }
}

ответы, которые я хочу получить, таковы: (возможно ли это?)

public class AppDataBindingComponent implements android.databinding.DataBindingComponent {
    @Override
    public RecyclerViewDataBinding getRecyclerViewDataBinding() {
        return new RecyclerViewDataBinding();
    }
}

public class LoginDataBindingComponent implements android.databinding.DataBindingComponent {
    @Override
    public LoginViewDataBinding getLoginViewDataBinding() {
        return null;
    }
}

1 Ответ

0 голосов
/ 31 июля 2019

Как насчет этого:

public class DataBindingComponent<T> implements android.databinding.DataBindingComponent {
    private T activity;

    public DataBindingComponent(T activity) {
        this.activity = activity;
    }

    public LoginViewDataBinding getLoginViewDataBinding() {
        return (LoginViewDataBinding) activity;
    }

    public RecyclerViewDataBinding getRecyclerViewDataBinding() {
        return (RecyclerViewDataBinding) activity;
    }
}

И чем создать в обоих ваших классах:

new AppDataBindingComponent(this)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...