Android 通过MVVM方法使用数据绑定和ViewModel创建RecycleView适配器
我想通过使用MVVM方法的数据绑定和视图模型,在RecyclerListview中显示数据。在我的XML中,我已经创建了视图模型类的数据变量,但是我的适配器类在语句中出现了错误Android 通过MVVM方法使用数据绑定和ViewModel创建RecycleView适配器,android,mvvm,data-binding,viewmodel,Android,Mvvm,Data Binding,Viewmodel,我想通过使用MVVM方法的数据绑定和视图模型,在RecyclerListview中显示数据。在我的XML中,我已经创建了视图模型类的数据变量,但是我的适配器类在语句中出现了错误 holder.chatlistitemBinding.setChatlistVM(mChatList.get(position)); 因为mChatList.getposition是ChatList模型的数组,而不是ViewModel的数组。我怎样才能纠正它?请不要建议更改指向模型ClassChatList的数据变量
holder.chatlistitemBinding.setChatlistVM(mChatList.get(position));
因为mChatList.getposition是ChatList模型的数组,而不是ViewModel的数组。我怎样才能纠正它?请不要建议更改指向模型ClassChatList的数据变量。我想通过视图模型实现MVVM方法。提前谢谢
我的XML文件:
在本例中,我不会扩展框架提供的ViewModel类,因为您只想将ViewModel绑定到特定视图
因此,解决方案很简单:
将chatList作为VM中的构造函数参数,然后将其设置为
holder.chatlistitemBinding.setChatlistVMnew ChatListViewModelmChatList.getposition 工厂级:
@Suppress("UNCHECKED_CAST")
class Factory @Inject constructor(
private val chatList: ChatList
) : ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
if (modelClass.isAssignableFrom(ChatListViewModel::class.java)) {
return ChatListViewModel(chatList) as T
}
throw IllegalArgumentException("Unknown ViewModel class: ${modelClass.canonicalName}")
}
}
谢谢你的回复。实际上,我在视图模型中使用了AndroidViewModel。我们需要找到处理这个问题的方法。谢谢你的建议。这确实是一个解决方案!!!如果你真的想使用android arch viewmodel,你可以定义一个工厂类来使用构造函数参数。你建议如何实现?
public class AdapterChatList extends RecyclerView.Adapter<AdapterChatList.ChatListViewHolder> {
private LayoutInflater mInflater;
private static final String TAG = "ChatListAdapter";
public List<ChatListViewModel> mChatList = new ArrayList<>();
public AdapterChatList(Context context) {
mInflater = LayoutInflater.from(context);
}
class ChatListViewHolder extends RecyclerView.ViewHolder{
private ChatlistitemBinding chatlistitemBinding;
public ChatListViewHolder(ChatlistitemBinding itemBinding) {
super(itemBinding.getRoot());
chatlistitemBinding = itemBinding;
}
}
@NonNull
@Override
public ChatListViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
if (mInflater == null) { mInflater = LayoutInflater.from(parent.getContext()); }
ChatlistitemBinding chatListUserItemBinding = DataBindingUtil.inflate(mInflater, R.layout.chatlistitem, parent, false);
return new ChatListViewHolder(chatListUserItemBinding);
}
@Override
public void onBindViewHolder(@NonNull ChatListViewHolder holder, int position) {
holder.chatlistitemBinding.setChatlistVM(mChatList.get(position));
holder.chatlistitemBinding.setHandlers(new ChatListHandlers());
holder.chatlistitemBinding.executePendingBindings();
}
@Override
public int getItemCount() {
if (mChatList != null)
return mChatList.size();
else return 0;
}
void add(ChatList chatList) {
mChatList.add(chatList);
notifyItemInserted(getItemCount());
}
public void updatelist(List<ChatList> userlist){//Need to rethink on this method
mChatList = userlist;
notifyDataSetChanged();
}
}
public class ChatListViewModelextends AndroidViewModel {
private ChatList chatList ;
public ChatListViewModel(Application application){
super(application);
chatList = new ChatList();
}
}
@Suppress("UNCHECKED_CAST")
class Factory @Inject constructor(
private val chatList: ChatList
) : ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
if (modelClass.isAssignableFrom(ChatListViewModel::class.java)) {
return ChatListViewModel(chatList) as T
}
throw IllegalArgumentException("Unknown ViewModel class: ${modelClass.canonicalName}")
}
}
viewModel = ViewModelProviders.of(this, viewModelFactory).get(ChatListViewModel:class.java);