Autore Topic: Cliccare su ListView personalizzata  (Letto 765 volte)

Offline oberdank

  • Utente normale
  • ***
  • Post: 287
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Core LTE
  • Play Store ID:
    BuzzOne
  • Sistema operativo:
    Windows 8.1
Cliccare su ListView personalizzata
« il: 27 Maggio 2015, 09:07:21 CEST »
0
Ho una ListView personalizzata.
Ogni riga della ListView contiene un nome e cognome, un numero e un bottone con scritto il numero (il bottone
dovrebbe essere dentro la classe "Contatto" ma non e' questo il punto).

Non riesco a intercettare il cliccaggio su un elemento della ListView, ho copiato il testo da un tutorial che ho
trovato su Internet ma non mi funziona.
Il metodo "onItemClick" NON viene mai chiamato.

Qualcuno puo' aiutarmi per favore?

********** MainActivity.java **********
Codice (Java): [Seleziona]
package prove.myapplication17;

import java.util.LinkedList;
import java.util.List;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.support.v7.internal.widget.AdapterViewCompat;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

class Contatto {

    private String nome;
    private String cognome;
    private String telefono;

    public Contatto(String nome, String cognome, String telefono) {
        this.nome = nome;
        this.cognome = cognome;
        this.telefono = telefono;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getCognome() {
        return cognome;
    }

    public void setCognome(String cognome) {
        this.cognome = cognome;
    }

    public String getTelefono() {
        return telefono;
    }

    public void setTelefono(String telefono) {
        this.telefono = telefono;
    }
}

class CustomAdapterOptimize extends ArrayAdapter<Contatto> {

    String s=null;

    public CustomAdapterOptimize(Context context, int textViewResourceId,
                                 Contatto[] objects) {
        super(context, textViewResourceId, objects);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        return getViewOptimize(position, convertView, parent);
    }

    public View getViewOptimize(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder = null;
        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) getContext()
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.rowcustom, null);
            viewHolder = new ViewHolder();
            viewHolder.name = (TextView)convertView.findViewById(R.id.textViewName);
            viewHolder.number = (TextView)convertView.findViewById(R.id.textViewNumber);

            viewHolder.bottone=(Button) convertView.findViewById(R.id.button1);

            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        Contatto contatto = getItem(position);
        viewHolder.name.setText(contatto.getNome()+" "+contatto.getCognome());
        viewHolder.number.setText(contatto.getTelefono());
        viewHolder.bottone.setText(contatto.getTelefono());

        return convertView;
    }

    private class ViewHolder {
        public TextView name;
        public TextView number;
        public Button bottone;
    }
}

public class MainActivity extends Activity {

    ListView listViewX;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Contatto[] list=new Contatto[3];

        list[0]=new Contatto("Antonio","Coschignano","123");
        list[1]=new Contatto("Giovanni","Rossi","456");
        list[2]=new Contatto("Giuseppe","Bianchi","789");

        CustomAdapterOptimize adapter = new CustomAdapterOptimize(this, R.layout.rowcustom, list);
        listViewX = (ListView)findViewById(R.id.listViewDemo);
        listViewX.setAdapter(adapter);
    }

    public void onResume()
    {
        super.onResume();

        Log.e("Partenza","Start");
        //***************************
        AdapterView.OnItemClickListener clickListener = new AdapterView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> adapter, View view,
                                    int position, long id)
            {
Toast.makeText(getApplicationContext(),"ciao",Toast.LENGTH_SHORT).show();
                Log.e("Cliccato:","pos="+position);
            }
        };
        listViewX.setOnItemClickListener(clickListener);
        //***************************
    }
}


********** rowcustom.xml **********
Codice (XML): [Seleziona]
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:orientation="vertical" >

    <TextView
       android:id="@+id/textViewName"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="" />

    <TextView
       android:id="@+id/textViewNumber"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text=""
       android:textColor="#00AA00"
       android:textSize="20sp"
       />

    <Button
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="New Button"
       android:id="@+id/button1"
       />

</LinearLayout>


********** main.xml **********
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >

<ListView
   android:id="@+id/listViewDemo"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   />

</LinearLayout>

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 594
  • Respect: +132
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:Cliccare su ListView personalizzata
« Risposta #1 il: 27 Maggio 2015, 10:09:24 CEST »
0
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline oberdank

  • Utente normale
  • ***
  • Post: 287
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Core LTE
  • Play Store ID:
    BuzzOne
  • Sistema operativo:
    Windows 8.1
Re:Cliccare su ListView personalizzata
« Risposta #2 il: 27 Maggio 2015, 16:07:21 CEST »
0
Caro Ohmnibus,
ho letto il tuo tutorial, ma non ho capito il 100%.
Nel mio programma ho sostituito "Button" con "ListButton" come indichi tu nel tutorial, ma e' tutto come prima,
quando clicco su un bottone della ListView non succede nulla.

Ho provato a scaricare "listview_tutorial3.zip" ma mi sembra che sia per Eclipse, io invece uso Android Studio.

Ti riporto il programma modificato (con "ListButton" al posto di "Button"), per favore mi dici dove nel programma
c'e' l'errore?
Come devo modificare il programma per farlo funzionare?

********** MainActivity.java **********
Codice (Java): [Seleziona]
package prove.myapplication17;

import java.util.LinkedList;
import java.util.List;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.support.v7.internal.widget.AdapterViewCompat;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

class Contatto {

    private String nome;
    private String cognome;
    private String telefono;
    private ListButton bottone;

    public Contatto(String nome, String cognome, String telefono) {
        this.nome = nome;
        this.cognome = cognome;
        this.telefono = telefono;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getCognome() {
        return cognome;
    }

    public void setCognome(String cognome) {
        this.cognome = cognome;
    }

    public String getTelefono() {
        return telefono;
    }

    public void setTelefono(String telefono) {
        this.telefono = telefono;
    }
}

class CustomAdapterOptimize extends ArrayAdapter<Contatto> {

    String s=null;

    public CustomAdapterOptimize(Context context, int textViewResourceId,
                                 Contatto[] objects) {
        super(context, textViewResourceId, objects);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        return getViewOptimize(position, convertView, parent);
    }

    public View getViewOptimize(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder = null;
        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) getContext()
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.rowcustom, null);
            viewHolder = new ViewHolder();
            viewHolder.name = (TextView)convertView.findViewById(R.id.textViewName);
            viewHolder.number = (TextView)convertView.findViewById(R.id.textViewNumber);

            viewHolder.bottone=(ListButton) convertView.findViewById(R.id.button1);

            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        Contatto contatto = getItem(position);
        viewHolder.name.setText(contatto.getNome()+" "+contatto.getCognome());
        viewHolder.number.setText(contatto.getTelefono());
        viewHolder.bottone.setText(contatto.getTelefono());

        return convertView;
    }

    private class ViewHolder {
        public TextView name;
        public TextView number;
        public ListButton bottone;
    }
}

/**
 * Un bottone definito per essere utilizzato in una {@link ListView}.
 */

class ListButton extends Button {

    /**
     * Costruttore di default, inizializza il bottone in base ad un contesto e ad un insieme di attributi.
     * @param context Contesto.
     * @param attrs Attributi della vista.
     */

    public ListButton(Context context, AttributeSet attrs) {
        super(context, attrs);
        //Rendo forzatamente il bottone non selezionabile.
        this.setFocusable(false);
    }

    /**
     * Imposta lo stato di pressione del bottone.
     * @param pressed Stato di pressione del bottone.
     */

    @Override
    public void setPressed(boolean pressed) {
        //Se il contenitore del bottone è premuto, allora non imposto anche il bottone a premuto
        if (pressed && ((View) getParent()).isPressed()) {
            return;
        }
        //Se il contenitore non è premuto, allora è stato toccato il bottone. Procedo normalmente.
        super.setPressed(pressed);
    }
}

public class MainActivity extends Activity {

    ListView listViewX;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Contatto[] list=new Contatto[3];

        list[0]=new Contatto("Antonio","Coschignano","123");
        list[1]=new Contatto("Giovanni","Rossi","456");
        list[2]=new Contatto("Giuseppe","Bianchi","789");

        CustomAdapterOptimize adapter = new CustomAdapterOptimize(this, R.layout.rowcustom, list);
        listViewX = (ListView)findViewById(R.id.listViewDemo);
        listViewX.setAdapter(adapter);
    }

    public void onResume()
    {
        super.onResume();

        Log.e("Partenza","Start");
        //***************************
        AdapterView.OnItemClickListener clickListener = new AdapterView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> adapter, View view,
                                    int position, long id)
            {
                Toast.makeText(getApplicationContext(),"ciao",Toast.LENGTH_SHORT).show();
                Log.e("Cliccato:","pos="+position);
            }
        };
        listViewX.setOnItemClickListener(clickListener);
        //***************************
    }
}


********** rowcustom.xml **********
Codice (XML): [Seleziona]
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:orientation="vertical" >

    <TextView
       android:id="@+id/textViewName"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="" />

    <TextView
       android:id="@+id/textViewNumber"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text=""
       android:textColor="#00AA00"
       android:textSize="20sp"
       />

    <prove.myapplication17.ListButton
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="New Button"
       android:id="@+id/button1"
       />

</LinearLayout>


********** main.xml **********
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >

<ListView
   android:id="@+id/listViewDemo"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   />

</LinearLayout>

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 594
  • Respect: +132
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:Cliccare su ListView personalizzata
« Risposta #3 il: 27 Maggio 2015, 16:21:05 CEST »
0
Prova a mettere

Codice (Java): [Seleziona]
//***************************
        AdapterView.OnItemClickListener clickListener = new AdapterView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> adapter, View view,
                                    int position, long id)
            {
                Toast.makeText(getApplicationContext(),"ciao",Toast.LENGTH_SHORT).show();
                Log.e("Cliccato:","pos="+position);
            }
        };
        listViewX.setOnItemClickListener(clickListener);
        //***************************

dopo

Codice (Java): [Seleziona]
listViewX.setAdapter(adapter);
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline oberdank

  • Utente normale
  • ***
  • Post: 287
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Core LTE
  • Play Store ID:
    BuzzOne
  • Sistema operativo:
    Windows 8.1
Re:Cliccare su ListView personalizzata
« Risposta #4 il: 27 Maggio 2015, 16:44:30 CEST »
0
Ho provato ed e' tutto come prima.

********** MainActivity.java **********
Codice (Java): [Seleziona]
package prove.myapplication17;

import java.util.LinkedList;
import java.util.List;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.support.v7.internal.widget.AdapterViewCompat;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

class Contatto {

    private String nome;
    private String cognome;
    private String telefono;
    private ListButton bottone;

    public Contatto(String nome, String cognome, String telefono) {
        this.nome = nome;
        this.cognome = cognome;
        this.telefono = telefono;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getCognome() {
        return cognome;
    }

    public void setCognome(String cognome) {
        this.cognome = cognome;
    }

    public String getTelefono() {
        return telefono;
    }

    public void setTelefono(String telefono) {
        this.telefono = telefono;
    }
}

class CustomAdapterOptimize extends ArrayAdapter<Contatto> {

    String s=null;

    public CustomAdapterOptimize(Context context, int textViewResourceId,
                                 Contatto[] objects) {
        super(context, textViewResourceId, objects);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        return getViewOptimize(position, convertView, parent);
    }

    public View getViewOptimize(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder = null;
        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) getContext()
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.rowcustom, null);
            viewHolder = new ViewHolder();
            viewHolder.name = (TextView)convertView.findViewById(R.id.textViewName);
            viewHolder.number = (TextView)convertView.findViewById(R.id.textViewNumber);

            viewHolder.bottone=(ListButton) convertView.findViewById(R.id.button1);

            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        Contatto contatto = getItem(position);
        viewHolder.name.setText(contatto.getNome()+" "+contatto.getCognome());
        viewHolder.number.setText(contatto.getTelefono());
        viewHolder.bottone.setText(contatto.getTelefono());

        return convertView;
    }

    private class ViewHolder {
        public TextView name;
        public TextView number;
        public ListButton bottone;
    }
}

/**
 * Un bottone definito per essere utilizzato in una {@link ListView}.
 */

class ListButton extends Button {

    /**
     * Costruttore di default, inizializza il bottone in base ad un contesto e ad un insieme di attributi.
     * @param context Contesto.
     * @param attrs Attributi della vista.
     */

    public ListButton(Context context, AttributeSet attrs) {
        super(context, attrs);
        //Rendo forzatamente il bottone non selezionabile.
        this.setFocusable(false);
    }

    /**
     * Imposta lo stato di pressione del bottone.
     * @param pressed Stato di pressione del bottone.
     */

    @Override
    public void setPressed(boolean pressed) {
        //Se il contenitore del bottone è premuto, allora non imposto anche il bottone a premuto
        if (pressed && ((View) getParent()).isPressed()) {
            return;
        }
        //Se il contenitore non è premuto, allora è stato toccato il bottone. Procedo normalmente.
        super.setPressed(pressed);
    }
}

public class MainActivity extends Activity {

    ListView listViewX;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Contatto[] list=new Contatto[3];

        list[0]=new Contatto("Antonio","Coschignano","123");
        list[1]=new Contatto("Giovanni","Rossi","456");
        list[2]=new Contatto("Giuseppe","Bianchi","789");

        CustomAdapterOptimize adapter = new CustomAdapterOptimize(this, R.layout.rowcustom, list);
        listViewX = (ListView)findViewById(R.id.listViewDemo);
        listViewX.setAdapter(adapter);

        //***************************
        AdapterView.OnItemClickListener clickListener = new AdapterView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> adapter, View view,
                                    int position, long id)
            {
                Toast.makeText(getApplicationContext(),"ciao",Toast.LENGTH_SHORT).show();
                Log.e("Cliccato:","pos="+position);
            }
        };
        listViewX.setOnItemClickListener(clickListener);
        //***************************
    }

    public void onResume()
    {
        super.onResume();

        Log.e("Partenza","Start");
        /*
        //***************************
        AdapterView.OnItemClickListener clickListener = new AdapterView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> adapter, View view,
                                    int position, long id)
            {
                Toast.makeText(getApplicationContext(),"ciao",Toast.LENGTH_SHORT).show();
                Log.e("Cliccato:","pos="+position);
            }
        };
        listViewX.setOnItemClickListener(clickListener);
        //***************************
        */

    }
}

Offline LinkOut

  • Utente normale
  • ***
  • Post: 269
  • Respect: +37
    • Mostra profilo
  • Dispositivo Android:
    Xiaomi Mi5
Re:Cliccare su ListView personalizzata
« Risposta #5 il: 27 Maggio 2015, 17:06:57 CEST »
0
IDE: Android Studio
Device: N5

Intanto inizia a mettere un pochino di ordine:


Ho preso quello che tu hai scritto qui, messo in quelle classi ed il click funziona, infatti io vedo il Toast con su scritto "CIAO", non capisco dove sia il problema...

Classi:

MainActivity
Codice (Java): [Seleziona]
package prove.myapplication17;

import android.app.Activity;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Toast;

import prove.myapplication17.adapter.CustomAdapterOptimize;
import prove.myapplication17.model.Contatto;


public class MainActivity extends Activity {

    ListView listViewX;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Contatto[] list=new Contatto[3];

        list[0]=new Contatto("Antonio","Coschignano","123");
        list[1]=new Contatto("Giovanni","Rossi","456");
        list[2]=new Contatto("Giuseppe","Bianchi","789");

        CustomAdapterOptimize adapter = new CustomAdapterOptimize(this, R.layout.raw_custom, list);
        listViewX = (ListView)findViewById(R.id.listViewDemo);
        listViewX.setAdapter(adapter);

        //***************************
        AdapterView.OnItemClickListener clickListener = new AdapterView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> adapter, View view,
                                    int position, long id)
            {
                Toast.makeText(getApplicationContext(), "Cliccato: pos=" + position, Toast.LENGTH_SHORT).show();
                Log.e("Cliccato:", "pos=" + position);
            }
        };
        listViewX.setOnItemClickListener(clickListener);
        //***************************
    }

    public void onResume()
    {
        super.onResume();

        Log.e("Partenza", "Start");
        /*
        //***************************
        AdapterView.OnItemClickListener clickListener = new AdapterView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> adapter, View view,
                                    int position, long id)
            {
                Toast.makeText(getApplicationContext(),"ciao",Toast.LENGTH_SHORT).show();
                Log.e("Cliccato:","pos="+position);
            }
        };
        listViewX.setOnItemClickListener(clickListener);
        //***************************
        */

    }
}

Model:
- Contatto
Codice (Java): [Seleziona]
package prove.myapplication17.model;

public class Contatto {

    private String nome;
    private String cognome;
    private String telefono;
    private ListButton bottone;

    public Contatto(String nome, String cognome, String telefono) {
        this.nome = nome;
        this.cognome = cognome;
        this.telefono = telefono;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getCognome() {
        return cognome;
    }

    public void setCognome(String cognome) {
        this.cognome = cognome;
    }

    public String getTelefono() {
        return telefono;
    }

    public void setTelefono(String telefono) {
        this.telefono = telefono;
    }
}

-ListButton
Codice (Java): [Seleziona]
package prove.myapplication17.model;

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.Button;

public class ListButton extends Button {

    /**
     * Costruttore di default, inizializza il bottone in base ad un contesto e ad un insieme di attributi.
     * @param context Contesto.
     * @param attrs Attributi della vista.
     */

    public ListButton(Context context, AttributeSet attrs) {
        super(context, attrs);
        //Rendo forzatamente il bottone non selezionabile.
        this.setFocusable(false);
    }

    /**
     * Imposta lo stato di pressione del bottone.
     * @param pressed Stato di pressione del bottone.
     */

    @Override
    public void setPressed(boolean pressed) {
        //Se il contenitore del bottone è premuto, allora non imposto anche il bottone a premuto
        if (pressed && ((View) getParent()).isPressed()) {
            return;
        }
        //Se il contenitore non è premuto, allora è stato toccato il bottone. Procedo normalmente.
        super.setPressed(pressed);
    }
}

Adapter
Codice (Java): [Seleziona]
package prove.myapplication17.adapter;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;

import prove.myapplication17.R;
import prove.myapplication17.model.Contatto;
import prove.myapplication17.model.ListButton;

public class CustomAdapterOptimize extends ArrayAdapter<Contatto> {

    String s=null;

    public CustomAdapterOptimize(Context context, int textViewResourceId,
                                 Contatto[] objects) {
        super(context, textViewResourceId, objects);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        return getViewOptimize(position, convertView, parent);
    }

    public View getViewOptimize(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder = null;
        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) getContext()
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.raw_custom, null);
            viewHolder = new ViewHolder();
            viewHolder.name = (TextView)convertView.findViewById(R.id.textViewName);
            viewHolder.number = (TextView)convertView.findViewById(R.id.textViewNumber);

            viewHolder.bottone=(ListButton) convertView.findViewById(R.id.button1);

            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        Contatto contatto = getItem(position);
        viewHolder.name.setText(contatto.getNome()+" "+contatto.getCognome());
        viewHolder.number.setText(contatto.getTelefono());
        viewHolder.bottone.setText(contatto.getTelefono());

        return convertView;
    }

    private class ViewHolder {
        public TextView name;
        public TextView number;
        public ListButton bottone;
    }
}


XML
activity_main.xml
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
   android:orientation="vertical" >

    <ListView
       android:id="@+id/listViewDemo"
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
       />

</LinearLayout>

raw_custom.xml
Codice (XML): [Seleziona]
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:orientation="vertical" >

    <TextView
       android:id="@+id/textViewName"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="" />

    <TextView
       android:id="@+id/textViewNumber"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text=""
       android:textColor="#00AA00"
       android:textSize="20sp"
       />

    <prove.myapplication17.model.ListButton
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="New Button"
       android:id="@+id/button1"
       />

</LinearLayout>

PS: Ovviamente così scritto il tap lo intercetta la lista! non il bottone!

---EDIT---

Per il tap sul bottone, devi modificare il tuo adapter con questo semplice codice...

nel metodo: getViewOptimize();

Codice (Java): [Seleziona]
viewHolder.bottone.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(context,"Hai premuso il bottone in posizione " + position, Toast.LENGTH_SHORT).show();
            }
        });

Il context l'ho preso dal costruttore.

Saluti.
« Ultima modifica: 27 Maggio 2015, 17:14:35 CEST da LinkOut, Reason: Tap sul bottone »

Offline oberdank

  • Utente normale
  • ***
  • Post: 287
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Core LTE
  • Play Store ID:
    BuzzOne
  • Sistema operativo:
    Windows 8.1
Re:Cliccare su ListView personalizzata
« Risposta #6 il: 27 Maggio 2015, 17:43:31 CEST »
0
Adesso funziona anche a me, pero' come si fa a fare in modo che succeda qualcosa alla pressione di un bottone?
(non di tutta la righa della ListView)

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 594
  • Respect: +132
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:Cliccare su ListView personalizzata
« Risposta #7 il: 27 Maggio 2015, 17:57:14 CEST »
0
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline oberdank

  • Utente normale
  • ***
  • Post: 287
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Core LTE
  • Play Store ID:
    BuzzOne
  • Sistema operativo:
    Windows 8.1
Re:Cliccare su ListView personalizzata
« Risposta #8 il: 27 Maggio 2015, 18:02:37 CEST »
0
GRAZIE ma il tutorial l'ho gia' letto.
Grazie delle risposte.
La variabile "position" l'ho dovuta dichiarare "final" perche' se no non veniva riconosciuta.

Nel caso avessi in una riga DUE bottoni? Come faccio a intercettarli?

Di seguito riporto il testo del metodo "getViewOptimize()"

Codice (Java): [Seleziona]
    public View getViewOptimize(final int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder = null;
        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) getContext()
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.raw_custom, null);
            viewHolder = new ViewHolder();
            viewHolder.name = (TextView)convertView.findViewById(R.id.textViewName);
            viewHolder.number = (TextView)convertView.findViewById(R.id.textViewNumber);

            viewHolder.bottone=(ListButton) convertView.findViewById(R.id.button1);

            //*****************
            viewHolder.bottone.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(getContext(),"Hai premuso il bottone in posizione "+position, Toast.LENGTH_SHORT).show();
                }
            });
            //*****************

            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        Contatto contatto = getItem(position);
        viewHolder.name.setText(contatto.getNome()+" "+contatto.getCognome());
        viewHolder.number.setText(contatto.getTelefono());
        viewHolder.bottone.setText(contatto.getTelefono());

        return convertView;
    }

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 594
  • Respect: +132
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:Cliccare su ListView personalizzata
« Risposta #9 il: 27 Maggio 2015, 18:08:59 CEST »
0
Per due bottoni usi "viewHolder.bottone2"

Per non dichiarare "position" final, o per passare un maggior numero di dati al click listener, puoi usare setTag/getTag:

Codice (Java): [Seleziona]
            viewHolder.bottone=(ListButton) convertView.findViewById(R.id.button1);
            viewHolder.bottone.setTag(position.toString());

            //*****************
            viewHolder.bottone.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    int position = Integer.parse(v.getTag());
                    Toast.makeText(getContext(),"Hai premuso il bottone in posizione "+position, Toast.LENGTH_SHORT).show();
                }
            });
            //*****************
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline oberdank

  • Utente normale
  • ***
  • Post: 287
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Core LTE
  • Play Store ID:
    BuzzOne
  • Sistema operativo:
    Windows 8.1
Re:Cliccare su ListView personalizzata
« Risposta #10 il: 27 Maggio 2015, 18:26:04 CEST »
0
Grazie Ohmnibus,
adesso funziona tutto, solo che nella riga

   int position = Integer.parse(v.getTag());

il metodo "parse" non viene riconosciuto.


Codice (Java): [Seleziona]
    public View getViewOptimize(final int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder = null;
        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) getContext()
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.raw_custom, null);
            viewHolder = new ViewHolder();
            viewHolder.name = (TextView)convertView.findViewById(R.id.textViewName);
            viewHolder.number = (TextView)convertView.findViewById(R.id.textViewNumber);

            viewHolder.bottone=(ListButton) convertView.findViewById(R.id.button1);
            //*****************
            viewHolder.bottone.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    Toast.makeText(getContext(),"Hai premuso il bottone in posizione "+position, Toast.LENGTH_SHORT).show();
                }
            });
            //*****************

            viewHolder.bottone2=(ListButton) convertView.findViewById(R.id.button2);
            //*****************
            viewHolder.bottone2.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // Non viene riconosciuto "parse"
                    //int position = Integer.parse(v.getTag());

                    Toast.makeText(getContext(),"Hai premuso il secondo bottone in posizione "+position, Toast.LENGTH_SHORT).show();
                }
            });
            //*****************

            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        Contatto contatto = getItem(position);
        viewHolder.name.setText(contatto.getNome()+" "+contatto.getCognome());
        viewHolder.number.setText(contatto.getTelefono());
        viewHolder.bottone.setText(contatto.getTelefono());
        viewHolder.bottone2.setText(contatto.getNome());

        return convertView;
    }