데이터 바인딩 라이브러리가 BindingAdapter의 실행 순서를 결정하는 방법을 이해해야합니다. 보기에 두 개의 BindingAdapter가 있고 View에 해당 BindingAdapter에 해당하는 특성이 모두있는 경우 먼저 어떤 어댑터가 먼저 실행될 것인지 결정하는 방법은 무엇입니까? 제게 사형 집행 명령이 중요하기 때문에 부탁드립니다.Android BindingAdapter 실행 순서?
나는 다음과 같은 BindingAdapter/S가 :
<Spinner
android:id="@+id/spinner_system_activity_edit_tracker_unit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="fill_horizontal"
app:entries="@{DatabaseModel.queryForAll()}"
app:selectedItem="@={object.selectedItem}"/>
DatabaseModel.queryForAll 데이터베이스를 조회하는 정적 방법 : 여기
public class SpinnerBindingAdapter {
@BindingAdapter(value = {"entries"})
public static void setEntries(Spinner spinner, List<? extends SpinnerItem> spinnerItems) {
for (int i = 0; i < spinnerItems.size(); i++) {
spinnerItems.get(i).setIndex(i);
}
ArrayAdapter<? extends SpinnerItem> adapter =
new ArrayAdapter<>(spinner.getContext(), R.layout.spinner_item, spinnerItems);
spinner.setAdapter(adapter);
}
@InverseBindingAdapter(attribute = "selectedItem", event = "selectedItemAttrChanged")
public static Object getSelectedItem(Spinner spinner) {
Object selectedItem = spinner.getSelectedItem();
return selectedItem;
}
@BindingAdapter(value = {"selectedItem"})
public static void setSelectedItem(Spinner spinner, SpinnerItem spinnerItem) {
if (spinner.getAdapter() == null) {
return;
}
// Other code omitted for simplicity
}
@BindingAdapter(value = {"selectedItemAttrChanged"}, requireAll = false)
public static void setOnItemSelectedListener(Spinner spinner, final InverseBindingListener selectedItemChange) {
if (selectedItemChange == null) {
spinner.setOnItemSelectedListener(null);
} else {
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
selectedItemChange.onChange();
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
}
}
}
와 나는 스피너를 채우고 선택을 설정하는 방법입니다 BindingAdapter에 주어진 객체 목록을 반환합니다. BindingAdapter는이 목록을 가져 와서 각 항목을 색인으로 업데이트하고 회 전자의 어댑터로 설정합니다.
어떤 이유로 든 "setSelectedItem"BindingAdapter가 항상 먼저 호출됩니다. 이것은 엔트리가 먼저 초기화되어야하기 때문에 바람직하지 않습니다. 최초로 초기화되어 있지 않은 경우는, setSelectedItem가 최초로 불려 갔을 때에 spinner.getAdapter()가 null가됩니다. 즉, 이전에 저장된 선택 항목은 복원되지 않습니다.
고맙습니다. 아주 좋은 답변입니다. 앞으로도 힘써주세요! – chaser