2010-04-29 3 views
2

Voici un problème que j'ai rencontré récemment: J'ai un listview avec une classe d'adaptateur personnalisée, l'adaptateur prend une liste de visualisation et remplit la listview avec des éléments de celui-ci . Maintenant, j'aimerais avoir un bouton sur chaque ligne d'une liste pour en retirer l'élément. Comment devrais-je aborder ce problème? Est-il possible de déclencher à distance une méthode dans la classe d'activité et d'appeler la méthode notifydatachanged() sur l'adaptateur pour actualiser la liste?ListAdapter pour modifier la source de données (qui est un arraylist)

Répondre

1

Je l'ai fait quelque chose comme ça:

public class MyAdapter extends Adapter { 

private final ArrayList<String> items = new ArrayList<String>(); 

// ... 

deleteRow(int position) { 
    items.remove(position); 
    notifyDataSetChanged(); 
} 
// 

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

    if(convertView == null) { 
     Tag tag = new Tag(); 
     // inflate as usual, store references to widgets in the tag 
     tag.button.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
        deleteRow(position); 
     } 
    }); 
    } 
    // don't forget to set the actual position for each row 
    Tag tag = (Tag)convertView.getTag(); 
    // ... 
    tag.position = position; 
    // ... 
} 



class Tag { 

    int position; 

    TextView text1; 
    // ... 
    Button button; 
} 

} 
+0

Assez cool, comment passez-vous l'ensemble de données modifié à l'activité? – dusker

+0

Pourquoi devriez-vous? 'notifyDataSetChanged();' déclenche la mise à jour ListView. – yanchenko

+0

oui c'est vrai, mais est-il possible de le passer à la classe d'activité? ou au moins le sérialiser pour qu'il soit accessible aux autres classes? – dusker

0

Dans la méthode getView(), ne pouvez-vous pas simplement définirOnClickListener() sur le bouton?

Quelque chose comme ceci:

static final class MyAdapter extends BaseAdapter { 

    /** override other methods here */ 

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

     if (convertView == null) { 
      // inflate the view for row from xml file 

      // keep a reference to each widget on the row. 
      // here I only care about the button 
      holder = new ViewHolder(); 
      holder.mButton = (Button)convertView.findViewById(R.id.button); 
      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder)convertView.getTag(); 
     } 

     // redefine the action for the button corresponding to the row 
     holder.mButton.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // do something depending on position 
       performSomeAction(position); 
       // mark data as changed 
       MyAdapter.this.notifyDatasetChanged(); 
      } 
     } 
    } 
    static final class ViewHolder { 
     // references to widgets 
     Button mButton; 
    } 
} 

Si vous n'êtes pas sûr sur l'extension BaseAdapter, consultez exemple List14 dans ApiDemos. Cette technique vous fournit une manière flexible de modifier à peu près n'importe quel aspect de votre adaptateur, même si c'est un peu de travail.

+0

Salut, merci pour votre aide, c'est à peu près ce que je fais ici. J'ai une classe d'activité qui a un tableau et une liste, j'ai une classe d'adaptateur dans laquelle je passe la liste et le tableau. Maintenant, une ligne dans un listview contient un bouton (chaque ligne), quand ce bouton est cliqué, je dois d'une manière ou d'une autre déclencher une méthode à l'intérieur d'une classe d'adaptateur mais une classe contenant l'activité. Comprenez vous? merci peter – dusker

Questions connexes