Создание адаптера RecycleView с использованием DataBinding и ViewModel через MVVM - PullRequest
0 голосов
/ 01 декабря 2018

Я хочу отобразить данные в RecyclerListview с помощью привязки данных и ViewModel с использованием подхода MVVM.В моем XML созданы переменные данных класса View Model, однако я получаю ошибку в своем классе адаптера в операторе

holder.chatlistitemBinding.setChatlistVM(mChatList.get(position)); 

, поскольку mChatList.get(position) является массивом ChatList модели, а не ViewModel.Как я могу это исправить?Пожалуйста, не советуйте изменять переменные данных, указывая на модель класса (ChatList).Я хочу реализовать MVVM подход через View Model.Заранее спасибо.

Мой XML-файл:

<?xml version="1.0" encoding="utf-8"?>

<layout xmlns:android="http://schemas.android.com/apk/res/android"
>
    <data >
    <variable name="handlers" type="com.support.android.designlibdemo.View.Handlers.ChatListHandlers"/>

      <variable name="chatlistVM" type="com.support.android.designlibdemo.ViewModel.ChatListViewModel" />
    </data>
    <RelativeLayout
    .......

            <TextView
                android:id="@+id/placeholder2"

                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@{chatlistVM.chatList.first_name}"
                android:textAppearance="?android:attr/textAppearanceSmall" 
      />
            ...
</layout>

Класс адаптера:

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

ViewModel:

public class ChatListViewModelextends AndroidViewModel {

    private ChatList chatList ;

    public ChatListViewModel(Application application){
        super(application);
        chatList = new ChatList();

    }

}

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Фабричный класс:

  @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}")
    }

}

Затем вы получаете свою виртуальную машину тем же способом, вам просто нужно передать экземпляр Factory Например, из вашего Fragment или FragmentActivity, который вы вызываете:

viewModel = ViewModelProviders.of(this, viewModelFactory).get(ChatListViewModel:class.java);
0 голосов
/ 02 декабря 2018

Я бы не стал расширять класс ViewModel, предоставляемый платформой в этом случае, поскольку вы хотите привязать ViewModel только к конкретному представлению.

Таким образом, решение простое: есть chatListв качестве параметра конструктора в вашем VM, затем установите его как holder.chatlistitemBinding.setChatlistVM(new ChatListViewModel(mChatList.get(position)));

...