Autore Topic: setOnItemClickListener quando il ListView contiene un layout non standard  (Letto 1333 volte)

Offline AlessioElia

  • Nuovo arrivato
  • *
  • Post: 29
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows XP
Salve ragazzi,
Innanzitutto piacere di conoscervi.
Ho un problema riguardante l'utilizzo di un ListView che contiene un'immagine,un testo e un checkbox fornisco qui il xml della riga
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
       xmlns:android="http://schemas.android.com/apk/res/android"
       android:layout_width="fill_parent"
       android:layout_height="60dip"
       android:padding="5dip">


        <ImageView
               android:id="@+id/appletImage"
               android:layout_width="50dip"
               android:layout_height="50dip"
       />
       


        <TextView
               android:text="Nome"
               android:layout_marginLeft="5dip"
               android:textAppearance="?android:attr/textAppearanceLarge"
               android:id="@+id/appletName"
               android:layout_toRightOf="@id/appletImage"
               android:layout_width="wrap_content"
               android:layout_height="wrap_content"></TextView>
        <CheckBox android:id="@+id/isActive"
           android:layout_width="wrap_content"
               android:layout_height="wrap_content"
                 android:layout_alignParentRight="true"
                 android:clickable="false"/>
</RelativeLayout>

Questa è invece la classe che contiene i dati del singolo item
Codice (Java): [Seleziona]
package my.prova.grafica;

public class ListViewItemApplet {
        private String name;
    private boolean activated;
    private int photoRes;
    public ListViewItemApplet(String name, boolean activated, int photoRes) {
            super();
            this.name = name;
            this.activated=activated;
            this.photoRes = photoRes;
    }
    public String getName() {
            return name;
    }
    public boolean getActivated() {
            return activated;
    }
    public int getPhotoRes() {
            return photoRes;
    }
        public void setName(String name) {
                this.name = name;
        }
        public void setActivated(boolean activated) {
                this.activated = activated;
        }
        public void setPhotoRes(int photoRes) {
                this.photoRes = photoRes;
        }
   
}
e questa invece la main activity che utilizza il ListView

Codice (Java): [Seleziona]
package my.prova.grafica;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;



import android.app.Activity;
import android.os.Bundle;
import android.text.Layout;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SubMenu;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.AlphaAnimation;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;

public class GraficaActivity extends Activity {

        private static final int RB_GROUP = 5;
        private static final int RADIO_BUTTON1 = -1;
        private static final int RADIO_BUTTON2 = -2;
        List<MenuItem> menuItems;
        private int appletSelezionata=0;
        /** Called when the activity is first created. */
        Object[] images=new Object[]{R.drawable.visa,R.drawable.loyalty,R.drawable.metro,R.drawable.tesseratifoso,R.drawable.sanita,R.drawable.cstp};
    ArrayList<ListViewItemApplet> appletList=new ArrayList<ListViewItemApplet>();
        ListView lwApplets;
        Button btMoreApplets;
        Button btNoApplets;
        AlphaAnimation toTransparent=new AlphaAnimation(1,0);
    AlphaAnimation toVisible=new AlphaAnimation(0,1);
        @Override
        public void onCreate(Bundle savedInstanceState) {
                //Add String
                super.onCreate(savedInstanceState);
                setContentView(R.layout.main);
                                appletList.add(new ListViewItemApplet("Visa",false,R.drawable.visa));
                                appletList.add(new ListViewItemApplet("Loyalty Card",false,R.drawable.loyalty));
                                appletList.add(new ListViewItemApplet("Metro Ticket",true,R.drawable.metro));
                                appletList.add(new ListViewItemApplet("Tessera del tifoso",true,R.drawable.tesseratifoso));
                                appletList.add(new ListViewItemApplet("Tessera Sanitaria",false,R.drawable.sanita));
                                appletList.add(new ListViewItemApplet("CSTP",false,R.drawable.cstp));
                ArrayList<HashMap<String, Object>> data=new ArrayList<HashMap<String,Object>>();
                for(int i=0;i<appletList.size();i++){
                        ListViewItemApplet p=appletList.get(i);// per ogni persona all'inteno della ditta
                        HashMap<String,Object> personMap=new HashMap<String, Object>();//creiamo una mappa di valori
                        personMap.put("image", p.getPhotoRes()); // per la chiave image, inseriamo la risorsa dell immagine
                        personMap.put("name", p.getName()); // per la chiave name,l'informazine sul nome
                        personMap.put("activated", p.getActivated());// per la chiave surnaname, l'informazione sul cognome
                        data.add(personMap);  //aggiungiamo la mappa di valori alla sorgente dati
                }
             
               
                       
                String[] from={"image","name","activated"}; //dai valori contenuti in queste chiavi
                int[] to={R.id.appletImage,R.id.appletName,R.id.isActive};//agli id delle view
               
                //costruzione dell adapter
                SimpleAdapter adapter=new SimpleAdapter(
                                getApplicationContext(),
                                data,//sorgente dati
                                R.layout.row, //layout contenente gli id di "to"
                                from,
                                to);
               
                //utilizzo dell'adapter
               ((ListView)findViewById(R.id.lwapplets)).setAdapter(adapter);
                toVisible.setDuration(5000);
               
                LinearLayout l=(LinearLayout)findViewById(R.id.layout);
                l.setAnimation(toVisible);
                 lwApplets=(ListView)findViewById(R.id.lwapplets);
             lwApplets.setOnItemClickListener(new OnItemClickListener() {
                    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                        // Quando cliccato visualizza un Toast col nome della città selezionata
                        Toast.makeText(getApplicationContext(),"ciao", Toast.LENGTH_SHORT).show();
                    }
                  });
 
        }

        public boolean onCreateOptionsMenu(Menu menu)
        {
                super.onCreateOptionsMenu(menu);
            menuItems=new ArrayList<MenuItem>();
                if(!appletList.get(appletSelezionata).getActivated())
        menuItems.add(menu.add(0,0, menu.NONE, "Attiva "));
        else
        menuItems.add(menu.add(0,0, menu.NONE, "Disattiva "));
               
            menuItems.add(menu.add(0,0, menu.NONE, "Home "));
                return true;
        }
        public boolean onOptionsItemSelected(MenuItem item)
        {
                super.onOptionsItemSelected(item);
                if (item.getItemId()==menuItems.get(0).getItemId())
                        if(  !appletList.get(appletSelezionata).getActivated())
                        {
                                 appletList.get(appletSelezionata).setActivated(true);
                                item.setTitle("Disattiva");
                        }
                        else
                        {
                                appletList.get(appletSelezionata).setActivated(false);
                                item.setTitle("Attiva");
                        }
                return false;
        }

        public boolean onPrepareOptionsMenu(Menu menu)
        {
                if(appletList.get(appletSelezionata).getActivated())
                {
                menuItems.get(0).setTitle("Attiva ");
             
                }
                else
                {
                menuItems.get(0).setTitle("Disattiva ");
                }
               
                return true;
        }
       
}
Il problema è questo mi serve che cliccando su un'item della listview la variabile appletSelezionata contenga il numero della riga selezionata.
Ho fatto lo stesso programma utilizzando però come contenuto della riga del ListView solo un testo e funzionava tutto, ora invece non mi "entra" nel Listener che associo al listView.
Aiuto!!!!!!

Offline AlessioElia

  • Nuovo arrivato
  • *
  • Post: 29
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows XP
Re:setOnItemClickListener quando il ListView contiene un layout non standard
« Risposta #1 il: 27 Febbraio 2012, 11:47:37 CET »
0
Ho risolto.
Serve settare la proprietà android:focusable="false" in tutti i componenti dell'item del listView.
Lascio il post in modo che qualcuno che si trovi con il mio stesso problema non perda ore inutilmente alla ricerca della soluzione!  ;-)

Offline UmbySlipKnot

  • Nuovo arrivato
  • *
  • Post: 46
  • Respect: 0
    • Mostra profilo
Re:setOnItemClickListener quando il ListView contiene un layout non standard
« Risposta #2 il: 23 Luglio 2012, 12:41:33 CEST »
0
Ho risolto.
Serve settare la proprietà android:focusable="false" in tutti i componenti dell'item del listView.
Lascio il post in modo che qualcuno che si trovi con il mio stesso problema non perda ore inutilmente alla ricerca della soluzione!  ;-)


Ciao! Ho lo stesso problema ma non riesco a far scatenare l'evento onClick sul listItem, ci sto provando in tutti i modi e sto perdendo ore e ore.
Ho messo android:focusable="false" a tutti gli elementi del mio listItem personalizzato "prodotto_lista" ma non funziona..
Ecco i punti salienti del mio codice java:
Codice (Java): [Seleziona]
public class ListaSpesa extends ListActivity {
    public void onCreate(Bundle savedInstanceState) {
        livProdotti = getListView();
        listaProdotti = new ArrayList<Prodotto>();
        newAdpt = new CustomListAdapter(this, R.layout.prodotto_lista, listaProdotti);
        livProdotti.setAdapter(newAdpt);

        livProdotti.setOnItemClickListener(new OnItemClickListener() {
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                        Toast.makeText(getApplicationContext(), "Click ListItem Number " + position, Toast.LENGTH_LONG).show();
                }
        });
    }
}
« Ultima modifica: 23 Luglio 2012, 12:44:15 CEST da UmbySlipKnot »

Offline davraf

  • Nuovo arrivato
  • *
  • Post: 9
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    GT-I9001
  • Sistema operativo:
    Android 2.3.6, Kernel 2.6.35.7
Re:setOnItemClickListener quando il ListView contiene un layout non standard
« Risposta #3 il: 17 Aprile 2013, 17:46:30 CEST »
0
risolto anche io!!!!!!!!!!!!!
beccato l'intruso: quando ho generato il file .xml con lo schema della riga, sono partito da un LinearLayout e dentro le dichiarazioni ci è finito anche il comando android:clickable="true". tolto quello ha funzionato alla grande.
posto di seguito il tag incriminato

Codice (XML): [Seleziona]
<LinearLayout xmlns:tools="http://schemas.android.com/tools"
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:orientation="horizontal"
  android:paddingLeft="10sp"
 android:clickable="true" > !!!! questa è la riga che ho eliminato !!!

Offline prezzemolo86

  • Nuovo arrivato
  • *
  • Post: 36
  • Respect: +1
    • Mostra profilo
Re:setOnItemClickListener quando il ListView contiene un layout non standard
« Risposta #4 il: 17 Maggio 2013, 12:26:00 CEST »
0
io non riesco a farlo funzionare. Pure io ne ho fatti due e mi sembrano uguali! Ma la seconda ListView non vuole assolutamente reagire al ClickEvent :-(