-1

Je construis une application Android et lorsque l'utilisateur clique sur l'un des éléments de mon RecyclerView, un AlertDialog apparaît qui leur permet de modifier cet élément de la liste.Comment remplir la vue personnalisée de AlertDialog avec des données dynamiques

Cependant, je voudrais afficher quelques informations sur l'élément qu'ils éditent sur le AlertDialog mais ne trouve pas un moyen de remplir le contenu de ma mise en page personnalisée que j'ai ajouté à la boîte de dialogue.

onClickListener qui crée le AlertDialog

holder.ivLinearLayout.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      if(mContext instanceof MainActivity) { 
       MainActivity mainActivity = (MainActivity) mContext; 
       AlertDialog.Builder builder = new AlertDialog.Builder(mainActivity); 

       builder.setTitle(mContext.getString(R.string.alert_food_detail_title)); 
       builder.setView(mainActivity.getLayoutInflater().inflate(R.layout.alert_detail_food, null)) 
         .setPositiveButton(mContext.getString(R.string.alert_food_detail_ok), new DialogInterface.OnClickListener() { 
          @Override 
          public void onClick(DialogInterface dialogInterface, int i) { 

          } 
         }) 
         .setNeutralButton(mContext.getString(R.string.alert_food_detail_cancel), new DialogInterface.OnClickListener() { 
          @Override 
          public void onClick(DialogInterface dialogInterface, int i) { 

          } 
         }) 
         .setNegativeButton(mContext.getString(R.string.alert_food_detail_exclude), new DialogInterface.OnClickListener() { 
          @Override 
          public void onClick(DialogInterface dialogInterface, int i) { 

          } 
         }); 

       AlertDialog dialog = builder.create(); 
       dialog.show(); 
      } 

     } 
    }); 

XML pour la mise en page personnalisée

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="horizontal"> 

    <TextView 
     android:id="@+id/textview_alert_food_name" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_weight="4" 
     android:textColor="@color/gray" 
     android:textSize="16sp" /> 

    <EditText 
     android:id="@+id/edittext_alert_food_quantity" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     android:ems="10" 
     android:inputType="numberDecimal" 
     android:textColor="@color/gray" 
     android:textSize="16sp" /> 

    <TextView 
     android:id="@+id/textview_alert_food_kcal" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     android:textColor="@color/gray" 
     android:textSize="16sp" /> 

    <TextView 
     android:id="@+id/textview_alert_food_carb" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     android:textColor="@color/gray" 
     android:textSize="16sp" /> 

    <TextView 
     android:id="@+id/textview_alert_food_prot" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     android:textColor="@color/gray" 
     android:textSize="16sp" /> 

    <TextView 
     android:id="@+id/textview_alert_food_fat" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     android:textColor="@color/gray" 
     android:textSize="16sp" /> 
</LinearLayout> 

Si plus de code est nécessaire laissez-moi savoir.

Voici à quoi ressemble mon AlertDialog maintenant, la vue personnalisée est appliquée correctement, mais il y a 5 TextViews que je voudrais remplir avec des données personnalisées et un EditText, une idée sur la façon de le faire?

My AlertDialog looks like this right now

+2

Vous pouvez gonfler la vue avant de la définir via le Builder. Cela vous permettra d'accéder à chaque texte par leurs identifiants. – RScottCarson

+0

Génial, avez-vous un exemple @RScottCarson? Cela résoudrait mon problème à coup sûr. – leofontes

+0

La réponse Liée par Mike M. montre les bases de ce que vous devez faire. – RScottCarson

Répondre

0

Vous devez créer votre classe pour boîte de dialogue personnalisée elle. Vous avez créé votre propre mise en page pour Dialog, utilisez-la pour votre propre classe de dialogue.

public class CustomDialog extends Dialog implements View.OnClickListener{ 
    private TextView foodName,foodQuantity,foodKcal,foodCarb,foodProt,foodFat; 
    public CustomDialog(Context context) { 
     super(context); 
     setContentView(R.layout.dialog_layout); 
     foodName = (TextView)findViewById(R.id.textview_alert_food_name); 
     foodQuantity = (TextView)findViewById(R.id.textview_alert_food_name); 
     foodKcal = (TextView)findViewById(R.id.textview_alert_food_kcal); 
     foodCarb = (TextView)findViewById(R.id.textview_alert_food_carb); 
     foodProt = (TextView)findViewById(R.id.textview_alert_food_prot); 
     foodFat = (TextView)findViewById(R.id.textview_alert_food_fat); 
     foodName.setOnClickListener(this); 
     foodQuantity.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View view) { 
     if(view == foodName){ 

     }else if(view == foodQuantity){ 
      // access them like this 
     } 
    } 
} 

Cette classe résoudrait votre solution. Si vous le souhaitez, vous pouvez envoyer View.OnClickListener en tant que paramètre et déclarer votre corps dans l'activité. Ou utilisez-le comme ça.