DataBinding 可见性取决于列表大小

DataBinding visibility depending on a list size

我有一个对象在数据绑定中用作变量。

public class Company {
    private int id;
    private String name;
    private List<Employee> employees;
    private List<Room> rooms;
}


<data>
     <variable
         name="item"
         type="com.blablabla.model.entity.Company"/>

</data>

想要根据列表大小(员工)更改视图的可见性,因此如果列表为空或为空 - 可见性消失,否则可见。

到目前为止我尝试了什么:
1)直接设置可见性:

  android:visibility="@{item.employees.size() > 0 ? View.VISIBLE : View.GONE}"

事实上,能见度总是一去不复返了。

当然是导入了

<import type="android.view.View"/>

2) 使用 BindingConverter:

@BindingConversion
    public static int convertCollectionToVisibility(Collection collection) {
        Log.d(TAG, "collection: " + (collection == null ? "null" : collection.size()));
        return collection == null || collection.isEmpty() ? View.GONE : View.VISIBLE;
    }

然后在布局中:

android:visibility="@{item.employees}"

此处日志显示,该集合始终为空。 但绝对不是

Company company = new Company(1, "Company 1");
List<Employee> employees = new ArrayList<>();
        employees.add(new Employee(i, "Jack", "Floyd"));
        company.setEmployees(employees);
mBinding.setItem(company);

有什么想法吗?

重新创建 sample program OP 后发现,他设置了错误的变量。

样本:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ActivityMainBinding binding = 
                DataBindingUtil.setContentView(this, R.layout.activity_main);
        Company company1 = new Company();
        Company company2 = new Company();

        ArrayList<String> employee2 = new ArrayList<>();
        employee2.add("First");
        company2.setEmployees(employee2);

        binding.setCompany1(company1);
        binding.setCompany2(company2);
    }

    @BindingConversion
    public static int listToVisibility(List list) {
        //Also works with Collection
        return (list == null || list.isEmpty()) ? View.INVISIBLE : View.VISIBLE;
    }
}

Xml:

<layout>
    <data>
        <variable
            name="company1"
            type="com.may.amy.bindingconversiontest.Company" />
        <variable
            name="company2"
            type="com.may.amy.bindingconversiontest.Company" />
    </data>
    <TextView
        android:text="Company1 has employees"
        android:visibility="@{company1.employees}"/>

    <TextView
        android:text="Company2 has employees"
        android:visibility="@{company2.employees}"/>
</layout>

我对 "visibility problem" 的首选解决方案是使用

ObservableInt listVisibility = new ObservableInt(View.GONE);

在我的 ViewModel 中。

boolean visible = list.size() > 0 || showHeaderIfEmpty; 
listVisibility .set(visible ? View.VISIBLE : View.GONE);  

优点是我的条件很容易取决于很多因素,而不仅仅是列表大小。

在xml中:

android:visibility="@{listVisibility}"

当然这可能需要更新,或者与 ObservableList 一起使用。

我刚遇到同样的问题,直接通过 item.employees.size(不带括号)设置可见性对我来说非常有效。

android:visibility="@{item.employees.size > 0 ? View.VISIBLE : View.GONE}"

让我们调用一个新文件 "BindingAdapters",因为您可能会在其他地方使用它。

object BindingAdapters {
    @JvmStatic
    @BindingAdapter("visibleGone")
    fun showHide(view: View, show: Boolean) {
        view.visibility = if (show) View.VISIBLE else View.GONE
    }
}

在 XML 上,您只需执行以下操作:

app:visibleGone="@{viewModel.list.isNotEmpty()}"

我没能直接从 ViewModel 访问列表,例如:

app:visibleGone="@{viewModel.list.isNotEmpty()}"

然而,解决我问题的方法是:

  1. 在 xml 上创建一个 boolean 类型:
<data>
...
  <variable
    name="hasItens"
    type="boolean" />
...
</data
  1. 在适配器更新时绑定 hasItens
vm.list.observe(viewLifecycleOwner) { list ->
            container.hasItens = !list.isNullOrEmpty()
            adapter.submitList(builtDates)
}
  1. 创建您的 BindAdapter:
@BindingAdapter("isGone")
fun bindIsGone(view: View, isGone: Boolean) {
    view.visibility = if (isGone) {
        View.GONE
    } else {
        View.VISIBLE
    }
}
  1. 设置“视图”的可见性
<RecyclerView
  android:id="@+id/recyclerId"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  app:isGone="@{!hasItens}" />

我使用 empty 如下,它对我有用:

android:visibility="@{viewModel.data.empty ? View.GONE : View.VISIBLE}"

如果有帮助请告诉我!