Можно ли изменить текст TextView с помощью метода, возвращающего String?
В целях обучения я создал этот класс ViewModel
, он помещает объект User
в List<User> mUserList
, и мне интересно, могу ли я установить имена этих пользователей в виде текста TextView с помощью метода ViewMode. Я получаю ошибку привязки, можно ли это исправить с помощью метода, который возвращает String без использования аннотации @BindingAdapter?
Изменить: когда я устанавливаю android:text="@{viewmodel.userList.toString()}"
, он не возвращает ошибку привязки, но возвращает строковое представление объектов пользователя. Но когда я использую android:text="@{viewmodel.getUserFirstNames()}"
, я получаю ошибку привязки. Почему это происходит?
public class UsersViewModel extends ViewModel {
private List<User> mUserList;
public List<User> getUserList() {
if (mUserList == null) {
mUserList = loadUsers();
}
return mUserList;
}
/**
* Dummy Method to fake web service
*
* @return list of users
*/
private List<User> loadUsers() {
// do something to load users
List<User> userList = new ArrayList<>();
User user = new User();
user.setFirstName("John");
user.setLastName("Adams");
userList.add(user);
user = new User();
user.setFirstName("Lucy");
user.setLastName("Adams");
userList.add(user);
return userList;
}
@NonNull
private String getUserFirstNames() {
if (mUserList != null && mUserList.size() > 0) {
StringBuilder sb = new StringBuilder();
sb.append("First Names:\n");
for (User user : mUserList) {
sb.append(user.getFirstName() + "\n");
}
return sb.toString();
}
return "empty";
}
}
В MainActivity я имитирую загрузку данных с помощью открытого класса MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityMainBinding activityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
UsersViewModel usersViewModel =
ViewModelProviders.of(this).get(UsersViewModel.class);
usersViewModel.getUserList();
activityMainBinding.setViewmodel(usersViewModel);
}
}
В макете мне интересно, можно ли установить текст TextView с классом ViewModel
<data>
<variable
name="viewmodel"
type="com.example.tutorial1basics.viewmodel.UsersViewModel" />
</data>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/tv_users"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{viewmodel.getUserFirstNames()}"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>
</layout>
android:text="@{viewmodel.userList.toString()}"
, он не возвращает ошибку привязки, но возвращает строковое представление объектов User. Но когда я используюandroid:text="@{viewmodel.getUserFirstNames()}"
, я получаю ошибку привязки. - person Thracian   schedule 21.06.2018