If I remove app:userList="@{viewModel.userList}" from RecyclerView inside activity_main.xml, it is able to build project, but using it gives me error: cannot find symbol for ActivityMainBindingImpl ^
Following are the files:
activity_main.xml
<data> <variable name="viewModel" type="com.example.databindingmvvmrespositoryjava.data.viewmodel.UserViewModel" /> </data> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="16dp" tools:context=".MainActivity"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="User List" android:textSize="18sp" android:textStyle="bold" /> <androidx.recyclerview.widget.RecyclerView android:id="@+id/recycler_view" android:layout_width="match_parent" app:userList="@{viewModel.userList}" android:layout_height="0dp" android:layout_weight="1" /></LinearLayout>MainActivity.java
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main); UserViewModel viewModel = new ViewModelProvider(this).get(UserViewModel.class); binding.setViewModel(viewModel); binding.setLifecycleOwner(this); UserAdapter adapter = new UserAdapter(); binding.recyclerView.setAdapter(adapter); // Observe changes in user list viewModel.getUserList().observe(this, users -> adapter.setUserList(users)); }}
list_item
<data> <variable name="userData" type="com.example.databindingmvvmrespositoryjava.data.model.User" /> </data> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{userData.name}" android:textSize="24sp" /> </LinearLayout>UserAdapter
public class UserAdapter extends RecyclerView.Adapter<UserAdapter.ViewHolder> { private List<User> userList; public void setUserList(List<User> userList) { this.userList = userList; notifyDataSetChanged(); } @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { ListItemBinding binding = ListItemBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false); return new ViewHolder(binding); } @Override public void onBindViewHolder(@NonNull ViewHolder holder, int position) { User user = userList.get(position); holder.binding.setUserData(user); holder.binding.executePendingBindings(); } @Override public int getItemCount() { return userList.size(); } static class ViewHolder extends RecyclerView.ViewHolder { private final ListItemBinding binding; public ViewHolder(@NonNull ListItemBinding binding) { super(binding.getRoot()); this.binding = binding; } }}
UserViewModel
public class UserViewModel extends ViewModel { private final MutableLiveData<List<User>> userList = new MutableLiveData<>(); private final UserRepository userRepository; public UserViewModel() { userRepository = new UserRepository(); fetchUsers(); } public LiveData<List<User>> getUserList() { return userList; } private void fetchUsers() { userRepository.getUsers(new UserRepository.UserCallback() { @Override public void onSuccess(List<User> users) { for (int i = 0; i < users.size(); ++i) { Log.i("onresponse....", "onSuccess: " + users.get(i).getName()); } userList.setValue(users); } @Override public void onFailure(String errorMessage) { // Handle failure } }); }}
User.java
public class User { private String name; public String getName() { return name; }}