2017-03-12 23 views
0

J'ai utilisé MVVM, Databinding et Retrofit pour développer cette application. J'ai chargé des données dans RecyclerView. Lorsque je clique sur un élément de RecyclerView, j'ai besoin de la position et des informations détaillées de ce poste. Parce que je vais montrer cette information dans une activité différente. Comment puis je faire ça?Comment puis-je sélectionner la position de l'article et les détails de l'article (modèle) dans RecyclerView?

J'ai besoin d'informations sur l'article et la position après avoir cliqué dessus. C'est sous View Model.

public void onItemClick(View view){ 
    Intent innn=new Intent(view.getContext(),HomeActivity.class); 
    view.getContext().startActivity(innn); 

} 

Voir Modèle:

package com.nitolniloygroup.operating.viewmodel; 

import android.content.Context; 
import android.content.Intent; 
import android.databinding.BaseObservable; 
import android.databinding.Bindable; 
import android.view.View; 
import android.widget.Toast; 

import com.nitolniloygroup.operating.BR; 
import com.nitolniloygroup.operating.model.Movie; 
import com.nitolniloygroup.operating.view.activity.HomeActivity; 
import com.nitolniloygroup.operating.view.activity.LoginActivity; 

/** 
* Created by durloveit on 12-Mar-2017. 
*/ 

public class MovieMVVMViewModel extends BaseObservable { 

    private Movie mMovie; 
    private Context mContext; 

    public MovieMVVMViewModel(Movie mMovie, Context mContext) { 
     this.mMovie = mMovie; 
     this.mContext = mContext; 
    } 

    @Bindable 
    public String getTitle() { 
     return mMovie.getTitle(); 
    } 

    public void setTitle(String title) { 
     mMovie.setTitle(title); 
     notifyPropertyChanged(BR.title); 
    } 

    @Bindable 
    public String getSubtitle() { 
     return mMovie.getReleaseDate(); 
    } 

    public void setSubtitle(String subtitle) { 
     mMovie.setReleaseDate(subtitle); 
     notifyPropertyChanged(BR.subtitle); 
    } 

    @Bindable 
    public String getDescription() { 
     return mMovie.getOverview(); 
    } 

    public void setDescription(String description) { 
     mMovie.setReleaseDate(description); 
     notifyPropertyChanged(BR.description); 
    } 

public View.OnClickListener onReadMoreClicked(){ 
    return new View.OnClickListener(){ 
     @Override 
     public void onClick(View view){ 
      //Toast.makeText(view.getContext(), "Button Read More", Toast.LENGTH_SHORT).show(); 
      Intent innn=new Intent(view.getContext(),LoginActivity.class); 
      view.getContext().startActivity(innn); 
     } 
    }; 
} 


public void onItemClick(View view){ 
    Intent innn=new Intent(view.getContext(),HomeActivity.class); 
    view.getContext().startActivity(innn); 

} 



} 

Adaptateur:

package com.nitolniloygroup.operating.view.adapter; 

import android.content.Context; 
import android.databinding.DataBindingUtil; 
import android.support.v7.widget.RecyclerView; 
import android.view.LayoutInflater; 
import android.view.ViewGroup; 


import com.nitolniloygroup.operating.databinding.ListItemMoviemvvmBinding; 
import com.nitolniloygroup.operating.model.Movie; 
import com.nitolniloygroup.operating.viewmodel.MovieMVVMViewModel; 

import com.nitolniloygroup.operating.R; 

import java.util.List; 

/** 
* Created by durloveit on 12-Mar-2017. 
*/ 

public class MovieMVVMAdapter extends RecyclerView.Adapter<MovieMVVMAdapter.BindingHolder>{ 

    private List<Movie> mMovies; 
    private Context mContext; 

    public MovieMVVMAdapter(List<Movie> mMovies, Context mContext) { 
     this.mMovies = mMovies; 
     this.mContext = mContext; 
    } 

    @Override 
    public BindingHolder onCreateViewHolder(ViewGroup parent,int viewType){ 
     ListItemMoviemvvmBinding binding= DataBindingUtil.inflate(
       LayoutInflater.from(parent.getContext()), 
       R.layout.list_item_moviemvvm,parent,false); 

     return new BindingHolder(binding); 
    } 

    @Override 
    public void onBindViewHolder(BindingHolder holder,int position){ 
     ListItemMoviemvvmBinding binding=holder.binding; 
     binding.setMoviemvvmVM(new MovieMVVMViewModel(mMovies.get(position),mContext)); 
    } 


    @Override 
    public int getItemCount(){ 
     return mMovies.size(); 
    } 

    public static class BindingHolder extends RecyclerView.ViewHolder{ 
     private ListItemMoviemvvmBinding binding; 

     public BindingHolder(ListItemMoviemvvmBinding binding){ 
      super(binding.cardviewMovieitem); 
      this.binding=binding; 
     } 
    } 
} 

XML:

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

<layout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto"> 
    <data> 
     <variable 
      name="moviemvvmVM" 
      type="com.nitolniloygroup.operating.viewmodel.MovieMVVMViewModel"></variable> 

    </data> 
    <android.support.v7.widget.CardView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:onClick="@{moviemvvmVM::onItemClick}" 
     android:id="@+id/cardview_movieitem"> 

     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:gravity="center_vertical" 
      android:minHeight="72dp" 
      android:orientation="horizontal" 

      android:padding="16dp"> 

     <LinearLayout 
      android:layout_width="0dp" 
      android:layout_height="wrap_content" 
      android:layout_weight="1" 
      android:orientation="vertical"> 

      <TextView 
       android:id="@+id/title" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_gravity="top" 
       android:paddingRight="16dp" 
       android:textStyle="bold" 
       android:text="@{moviemvvmVM.title}" 
       android:textSize="16sp" /> 


      <TextView 
       android:id="@+id/subtitle" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:text="@{moviemvvmVM.subtitle}" 
       android:paddingRight="16dp" 
       /> 

      <TextView 
       android:id="@+id/description" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:maxLines="3" 
       android:text="@{moviemvvmVM.description}" 
       android:paddingRight="16dp" 
       /> 

     </LinearLayout> 

      <Button 
       android:id="@+id/button5" 
       android:layout_width="0dp" 
       android:layout_height="wrap_content" 
       android:layout_weight="1" 
       android:gravity="right" 
       android:onClick="@{moviemvvmVM.onReadMoreClicked}" 
       android:text="Read More" /> 
     </LinearLayout> 

    </android.support.v7.widget.CardView> 
</layout> 
+2

Copie possible de [position de l'élément ViewPager avec liaison de données] (http://stackoverflow.com/questions/39463100/position-of-viewpager-item-with-data-binding) –

Répondre

0

Voici ce que je fais pour transmettre des données entre Fragment, activité ou adaptateurs. J'ai créé un ViewModel séparé qui est utilisé pour le transfert de données.

/** 
* ViewModel used for passing data between different components 
*/ 

public class DataPassingViewModel extends ViewModel { 
    private MutableLiveData<Object> mutableLiveData = new MutableLiveData<>(); 

    public void setData(final Object mObject) { 
    mutableLiveData.setValue(mObject); 
    } 

    public MutableLiveData<Object> getObservable() { 
    return mutableLiveData; 
    } 
} 

lsinitialisez en activité ou fragment contenant LifecycleOwner via

final DataPassingViewModel mDataPassingViewModel = ViewModelProviders.of(this).get(DataPassingViewModel.class); 

Observer sur la ViewModel

mDataPassingViewModel.getObservable().observe(this, object -> { 
     if (object != null) { 
     // Do whatever you want 
     } 
    }); 

adaptateur/Fragment, initialiser le DataPassingViewModel avec le contexte de l'activité des parents. Pour le fragment, vous pouvez obtenir le contexte parent via getActivity() mais pour les adaptateurs, vous pouvez obtenir le parent en le passant via le constructeur. Ainsi, vous pouvez créer une nouvelle instance via -

mDataPassingViewModel = 
    ViewModelProviders.of(mActivity).get(DataPassingViewModel.class); 

ou

mDataPassingViewModel = 
     ViewModelProviders.of(getActivity()).get(DataPassingViewModel.class); 

Pour transmettre des données en arrière mDataPassingViewModel.setData(mFileOrFolderTypes.get(position));. Depuis setData() accepte l'objet générique, vous pouvez passer n'importe quoi Integer, String ou classe entière.