2010-12-10 4 views
2

J'ai une liste personnalisée qui contient deux TextViews et deux boutons. Je veux un bouton pour changer les données montrées dans un TextView et je veux que l'autre bouton gonfle un dialogue expliquant le but de cette rangée. J'ai donc besoin de mettre à jour dynamiquement le contenu du dialogue. Autant que je sache, la seule façon d'insérer un bouton cliquable dans une liste est de setOnClickListener dans un adaptateur lorsque vous gonflez la ligne, mais je ne peux pas créer un dialogue en dehors de l'activité (je reçois un Close Force) . Voici mon appel getView(). Aucune suggestion??Android: Appel d'une boîte de dialogue à partir d'un bouton intégré dans une liste

publique Voir getView (position finale int, Vue parent convertView, ViewGroup) {

final ViewHolder holder; 

    if (convertView == null) { 

     convertView=mInflater.inflate(R.layout.text_list_item,null); 

     holder=new ViewHolder(); 
     holder.clear=(Button)convertView.findViewById(R.id.btnClr); 
     holder.label=(TextView) convertView.findViewById(R.id.textListItemLabel); 
     holder.value=(TextView) convertView.findViewById(R.id.textListItemValue); 
     holder.info=(Button)convertView.findViewById(R.id.btnInfo); 
     holder.group= (RadioGroup)convertView.findViewById(R.id.radiogroup); 
     holder.r1=(RadioButton)convertView.findViewById(R.id.radio1); 
     holder.r2=(RadioButton)convertView.findViewById(R.id.radio2); 
     holder.t1=(ToggleButton)convertView.findViewById(R.id.toggle1); 

     holder.clear.setOnClickListener(new OnClickListener(){ 
      private int pos= position; 

      @Override 
      public void onClick(View v){ 

       holder.value.setText(String.valueOf(pos)); 
       notifyDataSetChanged();//I know there's a problem on here, and I'm working on that... but at least it reacts to the button press. 

      } 
      }); 

     holder.info.setOnClickListener(new OnClickListener(){ 
      private int pos= position; 


      @Override 
      public void onClick(View v){ 
       Button button = (Button) v; 

       AlertDialog.Builder builder = new AlertDialog.Builder(context); 
       builder.setMessage("Are you sure you want to display?"); 
        .setCancelable(false) 
         .setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
          public void onClick(DialogInterface dialog, int id) { 
           MyActivity.this.finish(); 
          } 
         }) 
         .setNegativeButton("No", new DialogInterface.OnClickListener() { 
          public void onClick(DialogInterface dialog, int id) { 
           dialog.cancel(); 
          } 
         }); 
       builder.create();//Ok to here... 
       builder.show();//Crash 
       String.valueOf(pos), Toast.LENGTH_SHORT).show(); 
      } 


      }); 
     convertView.setTag(holder); 

    } else { 

     holder = (ViewHolder) convertView.getTag(); 
    } 

    return convertView; 

} 

Répondre

1

L'activité qui contenant l'adaptateur ne peut pas gérer son propre cycle de vie - Activity.onPause() quand il y a une demande d'un objet contenu tel cet adaptateur pour couvrir l'activité avec Dialog. Donc, pour le gérer, déplacez tout le code AlertDialog vers l'activité à l'intérieur d'une nouvelle méthode qui sera appelée en appuyant sur le bouton.

Vous pouvez le faire en remplissant l'argument de l'attribut dans la définition du bouton xml avec le nom de la méthode comme mentionné précédemment.

comme ici: http://androidforbeginners.blogspot.com/2010/03/clicking-buttons-in-listview-row.html

Questions connexes