0

J'ai commencé à travailler avec Retrofit. Dans ma demande j'ai un RecyclerView avec deux ViewHolder de, où essayant d'obtenir des données de mes modèles, dans les journaux à venir Type:Récupérer des données dans mon RecyclerView

@Override 
    public void onResponse(Call<DropDown> call, Response<DropDown> response) { 
     DropDown jsonResponse = response.body(); 
     Log.d("type",jsonResponse.getForm().getmGroupss().get(1).getmControls().get(2).getTitle()+""); 
     adapter = new DataAdapter(response.body()); 
     recyclerView.setAdapter(adapter); 
    } 

Comment puis-je afficher ce de type dans mon RecyclerView, s'il y aura quelques types? Maintenant je le message suivant:

09-13 09: 20: 40,958 2798-2798/com.random.secondproject E/RecyclerView: Aucun adaptateur attaché; sauter la mise en page

DataAdapter:

public class DataAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 

public static final String TYPE_TEXTVIEW = "0"; 
public static final String TYPE_EDITVIEW = "1"; 
private DropDown mList; 

public DataAdapter(DropDown list) { 
    this.mList = list; 
} 

@Override 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View view; 
    switch (viewType) { 
     case 0: 
      view = LayoutInflater.from(parent.getContext()).inflate(R.layout.text_numeric, parent, false); 
      return new NumericViewHolder(view); 
     case 1: 
      view = LayoutInflater.from(parent.getContext()).inflate(R.layout.drop_down_options, parent, false); 
      return new DropDownViewHolder(view); 
    } 
    return null; 
} 

@Override 
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
    DropDown object = mList.get(position); 
    if (object != null) { 
     switch (object.getTitle()){ 
      case TYPE_TEXTVIEW: 
       ((NumericViewHolder) holder).title.setText(String.valueOf(object.getTitle())); 
       break; 
      case TYPE_EDITVIEW: 
       ((DropDownViewHolder) holder).title_options.setText(String.valueOf(object.getTitle())); 
       break; 
     } 
    } 
} 

@Override 
public int getItemCount() { 
    if (mList == null) 
     return 0; 
    return mList.size(); 
} 

@Override 
public int getItemViewType(int position) { 
    DropDown object = mList.get(position); 
     if (object.getTitle().equals("drop_down_options")) 
     return 0; 
    else return 1; 
} 

public class NumericViewHolder extends RecyclerView.ViewHolder { 

    private TextView title; 

    public NumericViewHolder(View itemView) { 
     super(itemView); 
     title = (TextView) itemView.findViewById(R.id.title); 
    } 
} 

public class DropDownViewHolder extends RecyclerView.ViewHolder { 

    private EditText title_options; 

    public DropDownViewHolder(View itemView) { 
     super(itemView); 
     title_options = (EditText) itemView.findViewById(R.id.title_options); 
    } 

Comme vous pouvez le voir, je vais prendre deux types (TextView et EditText) donc je vais écrire quelques façons de modèle (tableau je pense) . Par exemple, comme je l'ai écrit dans Log.d.

+0

Je suppose que vous obtenez ce message avant que ** onResponse ** soit appelé, n'est-ce pas? –

+0

Oui, je peux montrer tout mon code dans MainActivity si c'est nécessaire. Vous voulez comprendre le problème. – Morozov

+1

En supposant que log.d imprime le type et le titre de la valeur. S'il vous plaît pouvez-vous ajouter le code DataAdapter en éditant la question –

Répondre

0

Tout me semble bien dans votre adaptateur. Essayez d'appeler recyclerView.invalidate(). L'idée est que vous dessinez votre RecyclerView avant d'appeler la méthode onResponse. Ainsi, vous avez une vue vide. La méthode invalidate() essayera de redessiner la vue.

+0

Même problème. Le problème est que je ne suis pas sûr que la sortie correcte des données dans RecyclerView. – Morozov

0

Il y a une erreur pour que la fonction onResponse ne puisse pas appeler, ou que vous le fassiez avec un élément dans recyclerview avant l'appel de onResponse.

Vous devez créer un adaptateur vide Dropdown

adapter = new DataAdapter(new Dropdown()); 

Lorsque vous onResponse appelé uniquement notifyDatasetChange à l'adaptateur, ne setAdapter à nouveau.

Ou vous mettez le code correspondant à l'élément de recyclerview à onResponse.

+0

Mais, comment puis-je changer l'appel dans la liste au lieu de journaux? – Morozov

+0

Je ne comprends pas votre question. Je ne connais pas votre classe Dropdown. Vous pouvez créer une variable globale: mDropdown = new Dropdown(), puis, après onResponse, vous effacez mDropdown par mDropdown.clear puis ajoutez une nouvelle valeur: mDropdown.add (response.body()). – phongvan