package cl.monsoon.s1next.view.adapter.delegate; import android.app.Activity; import android.databinding.DataBindingUtil; import android.support.annotation.NonNull; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.ViewGroup; import com.hannesdorfmann.adapterdelegates.AbsAdapterDelegate; import java.util.List; import javax.inject.Inject; import cl.monsoon.s1next.App; import cl.monsoon.s1next.R; import cl.monsoon.s1next.data.api.model.Thread; import cl.monsoon.s1next.data.pref.ThemeManager; import cl.monsoon.s1next.databinding.ItemThreadBinding; import cl.monsoon.s1next.viewmodel.ThreadViewModel; import cl.monsoon.s1next.viewmodel.UserViewModel; public final class ThreadAdapterDelegate extends AbsAdapterDelegate<List<Object>> { @Inject UserViewModel mUserViewModel; @Inject ThemeManager mThemeManager; private final LayoutInflater mLayoutInflater; public ThreadAdapterDelegate(Activity activity, int viewType) { super(viewType); App.getAppComponent(activity).inject(this); mLayoutInflater = activity.getLayoutInflater(); } @Override public boolean isForViewType(@NonNull List<Object> items, int position) { return items.get(position) instanceof Thread; } @NonNull @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent) { ItemThreadBinding binding = DataBindingUtil.inflate(mLayoutInflater, R.layout.item_thread, parent, false); // we do not use view model for ThemeManager // because theme changes only when Activity recreated binding.setUserViewModel(mUserViewModel); binding.setThemeManager(mThemeManager); binding.setThreadViewModel(new ThreadViewModel()); return new BindingViewHolder(binding); } @Override public void onBindViewHolder(@NonNull List<Object> items, int position, @NonNull RecyclerView.ViewHolder holder) { ItemThreadBinding binding = ((BindingViewHolder) holder).itemThreadBinding; binding.getThreadViewModel().thread.set((Thread) items.get(position)); binding.executePendingBindings(); } private static final class BindingViewHolder extends RecyclerView.ViewHolder { private final ItemThreadBinding itemThreadBinding; public BindingViewHolder(ItemThreadBinding itemThreadBinding) { super(itemThreadBinding.getRoot()); this.itemThreadBinding = itemThreadBinding; } } }