Autore Topic: Reperire bottoni da un ListView che usa ArrayAdapter  (Letto 694 volte)

Offline MisterAnt

  • Utente normale
  • ***
  • Post: 272
  • Respect: +4
    • IlSikano
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S4 Active,Galaxy SIII I9300, Galaxy Tab GT-P5100
  • Play Store ID:
    MisterAnt
  • Sistema operativo:
    Ubuntu 12.04/Winzoz 7/Winzoz xp
Reperire bottoni da un ListView che usa ArrayAdapter
« il: 24 Gennaio 2013, 16:41:38 CET »
0
Buon pomeriggio :)
Questa volta mi imbatto in un problema forse stupido XD
Nella mia applicazione io utilizzo una ListView con gli Adapter per farmi visualizzare su ogni riga 3bottoni e una stringa.
Come faccio ad utilizzare dei bottoni creati dinamicamente durante l'esecuzione se non conosco l'id della risorsa???
Posto un pò di codice...
CLASSE CHE USO COME ELEMENTO DI UNA RIGA (rowlist.xml)
Codice: [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/row"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <Button
        android:id="@+id/b1"
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        android:text="@string/preview" />

    <Button
        android:id="@+id/b2"
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        android:text="@string/set" />

    <Button
        android:id="@+id/b3"
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        android:text="@string/remove" />

    <TextView
        android:id="@+id/rowText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/nm"
        android:textSize="20sp" />

</LinearLayout>

Poi per aggiungere
Codice (Java): [Seleziona]
listView = (ListView) findViewById(R.id.arrayList);
vettore=new String[100];
//riempio il vettore di stringhe
arrayAdapter = new ArrayAdapter<String>(this,R.layout.rowlist,R.id.rowText,vettore);
listView.setAdapter(arrayAdapter);


HO PROVATO A FAR COSI' MA NIENTE...
Codice (Java): [Seleziona]
listView.setOnItemClickListener(new OnItemClickListener() {
  @Override
  public void onItemClick(AdapterView<?> parent, View view,
    int position, long id) {
    Toast.makeText(getApplicationContext(),
      "Click ListItem Number " + position, Toast.LENGTH_LONG)
      .show();
  }
});
« Ultima modifica: 24 Gennaio 2013, 18:08:12 CET da MisterAnt »
Se le zampe del coniglio sono così fortunate, che fine ha fatto il coniglio?

Offline elfo83

  • Utente normale
  • ***
  • Post: 287
  • Respect: +23
    • Mostra profilo
  • Sistema operativo:
    Mac OS 10.8.2
Re:Reperire bottoni da un ListView che usa ArrayAdapter
« Risposta #1 il: 24 Gennaio 2013, 21:41:35 CET »
0
Se non ho capito male non sai come catturare il click dei vari bottoni che si trovano all'interno di ogni riga della listview. Ti consiglio di implementare un tuo adapter e nel metodo getView() dichiari l'evento onClick() su ognuno dei 3 bottoni..Se ho capito male cerca di spiegarti meglio

Offline Melanogaster

  • Utente normale
  • ***
  • Post: 260
  • Respect: +11
    • Mostra profilo
  • Dispositivo Android:
    SII
  • Sistema operativo:
    Kubuntu
R: Reperire bottoni da un ListView che usa ArrayAdapter
« Risposta #2 il: 24 Gennaio 2013, 21:42:32 CET »
0
Anche secondo me la soluzione postata sopra é la più pulita e comoda

Offline MisterAnt

  • Utente normale
  • ***
  • Post: 272
  • Respect: +4
    • IlSikano
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S4 Active,Galaxy SIII I9300, Galaxy Tab GT-P5100
  • Play Store ID:
    MisterAnt
  • Sistema operativo:
    Ubuntu 12.04/Winzoz 7/Winzoz xp
Re:Reperire bottoni da un ListView che usa ArrayAdapter
« Risposta #3 il: 25 Gennaio 2013, 09:52:22 CET »
0
Magari fosse semplice...
Ho un ERRORE.. La mia classe adapter non accetta OnClickListener();
Codice (Java): [Seleziona]
class ListAdapterWithButton<T> extends BaseAdapter {
                  private final LayoutInflater mInflater;
                  private final T[] array;

                  public ListAdapterWithButton(final Context context, final T[] array) {
                   this.mInflater = LayoutInflater.from(context);
                   this.array = array;
                  }

                  public int getCount() {
                   return array.length;
                  }

                  public T getItem(int position) {
                   return array[position];
                  }

                  public long getItemId(int position) {
                   return position;
                  }

                  class ViewHolder {
                   TextView nomefilm;
                   Button preview;
                   Button remove;
                   Button set;
                  }

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

                   if (convertView == null) {
                    convertView = mInflater.inflate(R.layout.rowlist, null);
                    // Creates a ViewHolder and store references to the two children
                    // views
                    // we want to bind data to.
                    holder = new ViewHolder();
                   
                    holder.nomefilm=(TextView)convertView.findViewById(R.id.rowText);
                    holder.remove = (Button) convertView.findViewById(R.id.RemoveVideo);
                    holder.preview = (Button) convertView.findViewById(R.id.PreviewVideo);
                    holder.set = (Button) convertView.findViewById(R.id.SetVideo);
                   
                    remove.setOnClickListener(new OnClickListener() {
                     public void onClick(View v) {
                         Toast.makeText(getApplicationContext(), "Remove"+position, Toast.LENGTH_SHORT).show();
                     }
                    });
                    holder.set.setOnClickListener(new OnClickListener() {
                             public void onClick(View v) {
                                 Toast.makeText(getApplicationContext(), "Set"+position, Toast.LENGTH_SHORT).show();
                             }
                        });
                    holder.preview.setOnClickListener(new OnClickListener() {
                             public void onClick(View v) {
                                 Toast.makeText(getApplicationContext(), "Preview"+position, Toast.LENGTH_SHORT).show();
                             }
                        });                
                   
                    holder.nomefilm.setText(array[position].toString());
                    holder.preview.setText(array[position].toString());
                    holder.remove.setText(array[position].toString());
                    holder.set.setText(array[position].toString());
                    convertView.setTag(holder);
                   } else {
                           @SuppressWarnings("unchecked")
                        ViewHolder tag = (ViewHolder) convertView.getTag();
                                holder = tag;
                   }
                   return convertView;
                }
        }
« Ultima modifica: 25 Gennaio 2013, 09:55:49 CET da MisterAnt »
Se le zampe del coniglio sono così fortunate, che fine ha fatto il coniglio?

Offline elfo83

  • Utente normale
  • ***
  • Post: 287
  • Respect: +23
    • Mostra profilo
  • Sistema operativo:
    Mac OS 10.8.2
Re:Reperire bottoni da un ListView che usa ArrayAdapter
« Risposta #4 il: 26 Gennaio 2013, 15:32:31 CET »
0
Se invece di usare Holder fai in questo modo....
In questo caso non serve dichiarare la classe Holder, basta invece avere un film xml con la tua listView e un file xml con una textView e 3 bottoni che disponi come vuoi e poi..
Codice (Java): [Seleziona]
private class ListAdapter extends ArrayAdapter<OggettoTuaClasse> {
               
            private ArrayList<OggettoTuaClasse> items;
            private Activity context;

            public ListActAdapter(Activity context, int ViewResourceId, ArrayList<OggettoTuaClasse> items) {
            super(context.getApplicationContext(), ViewResourceId, items);
            this.items = items;
            this.context=context;
            }
           
           
            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
            View v = convertView;
            if (v == null)
            {
                LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                v = vi.inflate(R.layout.LayoutXmlPerOgniCellaDellaTusListView, null);
             }
                       
                                       
                                        TextView NomeFilm =(TextView)v.findViewById(R.id.NomeFilm);
                                        NomeFilm.setText(tuoOggetto.nomeFilm);
                               
                                        Button btnPrev=(Button)v.findViewById(r.id.btnPreview);
                                       Button btnSet=(Button)v.findViewById(r.id.btnSet);
                                       Button btnRem=(Button)v.findViewById(r.id.btnRemove);

                                       btnRmv.setOnClickListener(new OnClickListener() {
                                       @Override    
                                      public void onClick(View v) {
                                 Toast.makeText(getApplicationContext(), "Remove"+position, Toast.LENGTH_SHORT).show();
                                                                               }
                                         });
                            btnSet.setOnClickListener(new OnClickListener() {
                          @Override  
                          public void onClick(View v) {
                                 Toast.makeText(getApplicationContext(), "Set"+position, Toast.LENGTH_SHORT).show();
                             }
                        });
                          btnPrev.setOnClickListener(new OnClickListener() {
                            @Override
                              public void onClick(View v) {
                                 Toast.makeText(getApplicationContext(), "Preview"+position, Toast.LENGTH_SHORT).show();
                             }
                        });    
                                               
                 
            return v;
            }
        }

Poi quando devi avrai la tua ArrayList con i tuoi oggetti da mostrare scriverai..
Codice (Java): [Seleziona]
ListAdapter listAdp=new ListAdapter(this,R.layout.FileXmlCheDescriveLaSingolaCellaDellaLista, tuaLista);
                        activitylistView.setAdapter(listAdp);

Offline kiros

  • Nuovo arrivato
  • *
  • Post: 18
  • Respect: 0
    • Mostra profilo
    • StefanoFibbi
  • Dispositivo Android:
    Samsung Galaxy S2
  • Sistema operativo:
    Windows 7
Re:Reperire bottoni da un ListView che usa ArrayAdapter
« Risposta #5 il: 27 Gennaio 2013, 20:10:27 CET »
0
Guarda io sto facendo una roba del genere in un'applicazione che sto sviluppando in questi giorni. L'adapter che ho scritto è così:

Codice (Java): [Seleziona]
public class NotaAdapter extends ArrayAdapter<Nota> {
        private List<Nota> items;
       
        // Costruttore
        public NotaAdapter(Context context, int idRes, List<Nota> items){
                super(context, idRes, items);
                this.items = items;
        }
       
       
        // Override getView
        public View getView(int position, View convertView, ViewGroup parent){
               
                // Variabile d'appoggio
                View v = convertView;
               
                // Controllo se è null
                if(v == null){
                        LayoutInflater inflater = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                        v = inflater.inflate(R.layout.anteprima_nota, null);
                }
               
                // Recupero la nota i-esima
                Nota n = this.items.get(position);
               
                // Se non è null, imposto tutto
                if(n != null){
                        ViewNota holder = new ViewNota();
                       
                        // Recupero gli elementi
                        holder.rating = (RatingBar) v.findViewById(R.id.ratingbarPunteggioNota);
                        holder.titolo = (TextView) v.findViewById(R.id.textviewTitoloNota);
                        holder.timestamp = (TextView) v.findViewById(R.id.textviewTimestampNota);
                       
                       
                        // Se ho trovato gli elementi, imposto i valori corretti
                        if(holder.rating != null){
                                holder.rating.setRating(n.getRating());
                        }
                       
                        if(holder.titolo != null){
                                holder.titolo.setText(n.getTitle());
                        }
                       
                        if(holder.timestamp != null){
                                // Ottengo il timestamp nel formato "data, ora". Separo data e ora in
                                // due elementi distinti del vettore
                                String[] d = n.getTimestamp().split(",");
                               
                                // Rimuovo eventuali spazi
                                for(int i=0; i<d.length; i++){
                                        d[i] = d[i].replaceAll(" ", "");
                                }
                               
                                // Setto il testo
                                holder.timestamp.setText(d[0] + "\n" + d[1]);
                        }
                }
               
                return v;
        }
       

        // Classe di appoggio contenente gli elementi del layout della nota
        private class ViewNota{
                public TextView titolo;
                public TextView timestamp;
                public RatingBar rating;
        }
}

Con l'adapter settato in questo modo, ho implementato onItemClickListener (intendo così)
Codice (Java): [Seleziona]
public class MainActivity extends Activity implements OnItemClickListener
e il setting del listener avviene in questo modo
Codice (Java): [Seleziona]
this.listView.setOnItemClickListener(this);

Per quanto riguarda gli elementi della ListView, fanno parte di una lista con generics
Codice (Java): [Seleziona]
List<Note> listView

Facendo così, non ho più avuto problemi di visualizzazione o con il listener :)