Android 通过MVVM方法使用数据绑定和ViewModel创建RecycleView适配器

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的数据变量

我想通过使用MVVM方法的数据绑定和视图模型,在RecyclerListview中显示数据。在我的XML中,我已经创建了视图模型类的数据变量,但是我的适配器类在语句中出现了错误

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);