2013-02-11 16 views
10

Ho esaminato molte domande simili e sembra che non riesca a far funzionare nulla. Ho una classe principale con una funzione come questa che modifica mostra una finestra di dialogo quindi modifica un elenco quando viene premuto un pulsante.Come chiamare la funzione dell'attività principale da ArrayAdapter personalizzato?

public class EditPlayers extends SherlockFragmentActivity { 

    listPlayerNames.setAdapter(new EditPlayerAdapter(ctx, 
       R.layout.score_row_edit_player, listScoreEdit)); 

public void deletePlayer(final int position) { 
    AlertDialog.Builder alertDialog = new AlertDialog.Builder(
      EditPlayers.this); 

    // Setting Dialog Title 
    alertDialog.setTitle("Delete Player"); 

    // Setting Dialog Message 
    alertDialog.setMessage("Are you sure?"); 

    // Setting Delete Button 
    alertDialog.setPositiveButton("Delete", 
      new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int which) { 
        listScoreEdit.remove(position); 
        updateListView(); 
       } 
      }); 

    // Setting Cancel Button 
    alertDialog.setNeutralButton("Cancel", 
      new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int which) { 
        dialog.cancel(); 
       } 
      }); 

    // Showing Alert Message 
    alertDialog.show(); 
} 

} 

Come accedere a tale funzione da getView() nell'adattatore? Ecco il codice XML per la riga

<TextView 
    android:id="@+id/nameEdit" 
    android:layout_width="0dp" 
    android:layout_height="wrap_content" 
    android:paddingBottom="10dp" 
    android:paddingTop="10dp" 
    android:paddingLeft="10dp" 
    android:layout_weight="70" 
    android:text="Name" 
    android:textColor="#666666" 
    android:textSize="22sp" 
    android:textStyle="bold" > 
    </TextView> 

<Button 
    android:id="@+id/deletePlayer" 
    android:layout_width="0dp" 
    android:layout_height="wrap_content" 
    android:layout_weight="30" 
    android:text="Delete" 
    android:focusable="false" /> 

Ecco il GetView()

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 

    convertView = (LinearLayout) inflater.inflate(resource, null);  
    Score score = getItem(position); 
    TextView txtName = (TextView) convertView.findViewById(R.id.nameEdit); 
    txtName.setText(score.getName()); 
    Button b = (Button)convertView.findViewById(R.id.deletePlayer); 
    b.setTag(position); 
    b.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       //call function here 
      } 
    }); 
    return convertView; 
} 

io sono totalmente perso a questo punto in modo che qualsiasi aiuto sarebbe apprezzato. Grazie!

risposta

31

Si consiglia di fornire un interface indietro alla tua attività che consente di sapere quando viene premuto quel pulsante. Non consiglierei di chiamare il metodo di un'attività da un ArrayAdapter. È troppo strettamente accoppiato.

provare qualcosa di simile:

tuo Activity

public class EditPlayers extends SherlockFragmentActivity implements EditPlayerAdapterCallback { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 

     EditPlayerAdapter adapter = new EditPlayerAdapter(this, 
       R.layout.score_row_edit_player, listScoreEdit); 
     adapter.setCallback(this); 
     listPlayerNames.setAdapter(adapter); 

    } 

    private void deletePlayer(final int position) { 
     AlertDialog.Builder alertDialog = new AlertDialog.Builder(
       EditPlayers.this); 

     // Setting Dialog Title 
     alertDialog.setTitle("Delete Player"); 

     // Setting Dialog Message 
     alertDialog.setMessage("Are you sure?"); 

     // Setting Delete Button 
     alertDialog.setPositiveButton("Delete", 
       new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int which) { 
         listScoreEdit.remove(position); 
         updateListView(); 
        } 
       }); 

     // Setting Cancel Button 
     alertDialog.setNeutralButton("Cancel", 
       new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int which) { 
         dialog.cancel(); 
        } 
       }); 

     // Showing Alert Message 
     alertDialog.show(); 
    } 

    @Override 
    public void deletePressed(int position) { 

     deletePlayer(position); 
    } 

} 

Adapter:

public class EditPlayerAdapter extends ArrayAdapter { 

    private EditPlayerAdapterCallback callback; 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 

     convertView = (LinearLayout) inflater.inflate(resource, null);  
     Score score = getItem(position); 
     TextView txtName = (TextView) convertView.findViewById(R.id.nameEdit); 
     txtName.setText(score.getName()); 
     Button b = (Button)convertView.findViewById(R.id.deletePlayer); 
     b.setTag(position); 
     b.setOnClickListener(new View.OnClickListener() { 
       public void onClick(View v) { 

        if(callback != null) { 

         callback.deletePressed(position); 
        } 
       } 
     }); 
     return convertView; 
    } 

    public void setCallback(EditPlayerAdapterCallback callback){ 

     this.callback = callback; 
    } 


    public interface EditPlayerAdapterCallback { 

     public void deletePressed(int position); 
    } 
} 
+0

Grazie, questo ha funzionato perfettamente! – GrilledCheese

+0

Wow, questa era una magia. –

+0

grazie. la soluzione migliore per me :) – SAndroidD

12

Il tuo EditPlayerAdapter riceve un Context. Activity estende Context

Se il Context passato è la vostra EditPlayers e memorizzare un riferimento di classe con ambito a quella Context nel vostro adattatore, è possibile fare:

((EditPlayers) yourContextVar).function(); 

Meglio ancora, fare un'interfaccia di qualche tipo. Aiuterà a chiarire e organizzare il codice e applica lo stesso principio.

Problemi correlati