Autore Topic: Aggiornare TextView all'onclick su item di ListView personalizzata  (Letto 1634 volte)

Offline UmbySlipKnot

  • Nuovo arrivato
  • *
  • Post: 46
  • Respect: 0
    • Mostra profilo
0
Salve a tutti!
Sto implementando una lista attraverso una ListView con elementi personalizzati.
La lista è un ArrayAdapter di elementi definiti con la classe Prodotto.
Ogni elemento della lista è cliccabile e contiene un pulsante.
Al click sul pulsante o sull'elemento devo aggiornare due TextView (txtNumProd e txtNumDaTrovare) contenute nel layout lista_spesa.xml ma non riesco a far scatenare l'evento onclick sul singolo elemento della lista in modo corretto...
Ho già provato con tutti i vari setOnClickListener ma senza risultati...

Ecco il mio codice:

Lista_spesa.xml
Codice (XML): [Seleziona]
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools"
   android:id="@+id/LinearLayout1"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:background="@color/green"
   android:orientation="vertical"
   android:padding="@dimen/padding_small" >

    <TextView
       android:id="@+id/txtComprare"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:layout_gravity="center|center_horizontal"
       android:paddingBottom="@dimen/padding_medium"
       android:text="@string/comprare"
       android:textSize="@dimen/textsize_pdv_titolo"
       android:textStyle="bold"
       android:typeface="normal"
       tools:context=".PuntoVenditaDett" />

    <TableRow
       android:id="@+id/tableRow1"
       android:layout_width="match_parent"
       android:layout_height="50dp"
       android:paddingBottom="@dimen/padding_small" >

        <MultiAutoCompleteTextView
           android:id="@+id/actProdotto"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:ems="10"
           android:inputType="textNoSuggestions" />

        <ImageButton
           android:id="@+id/imbAggiungi"
           android:layout_width="@dimen/width_btn_medium"
           android:layout_height="@dimen/width_btn_medium"
           android:layout_gravity="center_vertical"
           android:background="@color/transparent"
           android:src="@drawable/content_new" />

        <ImageButton
           android:id="@+id/imbBarCode"
           android:layout_width="@dimen/width_btn_medium"
           android:layout_height="@dimen/width_btn_medium"
           android:layout_gravity="center_vertical"
           android:background="@color/transparent"
           android:src="@drawable/content_select_all" />
    </TableRow>

    <View
       android:layout_width="fill_parent"
       android:layout_height="1dp"
       android:background="@android:color/white" />

    <ListView
       android:id="@android:id/list"
       android:layout_width="wrap_content"
       android:layout_height="446dp"
       android:layout_gravity="fill_vertical"
       android:layout_weight="0.84"
       android:paddingTop="@dimen/padding_small" >
    </ListView>

    <RelativeLayout
       android:id="@+id/linDettagli"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:layout_gravity="fill_vertical"
       android:columnCount="3"
       android:orientation="horizontal" >


        <TextView
           android:id="@+id/txtNumProd"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:layout_alignParentLeft="true"
           android:layout_alignParentTop="true"
           android:layout_gravity="left"
           android:padding="@dimen/padding_small"
           android:text="0 prodotti" />


        <TextView
           android:id="@+id/txtNumDaTrovare"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:layout_alignParentRight="true"
           android:layout_alignParentTop="true"
           android:padding="@dimen/padding_small"
           android:text="0 da trovare" />

    </RelativeLayout>

</LinearLayout>

CustomListAdapter.java
Codice (Java): [Seleziona]
package com.fedrasoft.trackall;

import java.util.ArrayList;

import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

public class CustomListAdapter extends ArrayAdapter<Prodotto> {
       
        private Context appContext = null;
        private ArrayList<Prodotto> items = null;
        private int iNumDaTrovare;
       
        public CustomListAdapter(Context context, int textViewResourceId, ArrayList<Prodotto> items){
                super(context, textViewResourceId, items);
                this.appContext = context;
                this.items = items;
                this.setiNumDaTrovare(0);
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
                View v = convertView;
                if (v == null) {
                        LayoutInflater vi = (LayoutInflater) appContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                        v = vi.inflate(R.layout.prodotto_lista, null);
                }
                final Prodotto o = items.get(position);
                if (o != null) {
                        TextView nomeProdotto = (TextView)v.findViewById(R.id.txtProdotto);
                        ImageButton btnDelete = (ImageButton)v.findViewById(R.id.imbCancella);
                        final ImageView imvNelCarrello = (ImageView)v.findViewById(R.id.imvNelCarrello);
                       
                        btnDelete.setOnClickListener(new OnClickListener() {
                                public void onClick(View view) {
                                        items.remove(o);
                                        setiNumDaTrovare(getiNumDaTrovare() - 1);
                                       
                                // Aggiornamento dettagli prodotti
                                LayoutInflater inflater = (LayoutInflater)appContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                                View vListaSpesa = inflater.inflate(R.layout.lista_spesa, null);

                                TextView txtNumProd = (TextView)vListaSpesa.findViewById(R.id.txtNumProd);
                               
                                String sProd = "prodotti";
                                        if (items.size() == 1) {
                                                sProd = "prodotto";
                                        }
                                       
                                        txtNumProd.setText(items.size() + " " + sProd);
                                       
                                        notifyDataSetChanged();
                                }
                        });

                        nomeProdotto.setOnClickListener(new OnClickListener() {
                                public void onClick(View view) {
                                        o.setbNelCarrello(changeVisibility(imvNelCarrello));
                                }
                        });
                       
                        if (nomeProdotto != null) {
                                nomeProdotto.setText(o.getsNome());
                                if (o.getbNelCarrello()) {
                                        imvNelCarrello.setVisibility(View.VISIBLE);
                                } else {
                                        imvNelCarrello.setVisibility(View.INVISIBLE);
                                }
                                //Toast.makeText(appContext, "" + getiNumDaTrovare(), 1000).show();
                        }
                }
                return v;
        }

        protected boolean changeVisibility(View view) {
                // TODO Auto-generated method stub
                boolean bRet = false;
                if (view.getVisibility() == View.VISIBLE) {
                        view.setVisibility(View.INVISIBLE);
                        setiNumDaTrovare(getiNumDaTrovare() + 1);
                        bRet = false;
                } else if (view.getVisibility() == View.INVISIBLE) {
                        view.setVisibility(View.VISIBLE);
                        setiNumDaTrovare(getiNumDaTrovare() - 1);
                        bRet = true;
                }
                return bRet;
        }

        public int getiNumDaTrovare() {
                return iNumDaTrovare;
        }

        public void setiNumDaTrovare(int iNumDaTrovare) {
                this.iNumDaTrovare = iNumDaTrovare;
        }
}

ListaSpesa.java
Codice (Java): [Seleziona]
package com.fedrasoft.trackall;

import java.util.ArrayList;

import android.os.Bundle;
import android.app.AlertDialog;
import android.app.ListActivity;
import android.content.DialogInterface;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.MultiAutoCompleteTextView;
import android.widget.TextView;
import android.widget.Toast;

public class ListaSpesa extends ListActivity {

        //LIST WHICH WILL SERVE AS LIST ITEMS
        ArrayList<Prodotto> listaProdotti = null;

        //DEFINING ADAPTER WHICH WILL HANDLE DATA OF LISTVIEW
        private CustomListAdapter newAdpt = null;
       
        private MultiAutoCompleteTextView textView = null;
        private ImageButton btnAggiungi = null;
        //private ListView livProdotti = null;
       
        private TextView txtNumProd = null;
        private TextView txtNumDaTrovare = null;
       
        private int i = 0;
       
    @Override
    public void onCreate(Bundle savedInstanceState) {
        try {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.lista_spesa);
        } catch (Exception e) {
                // this is the line of code that sends a real error message to the log
                Log.e("ERROR", "ERROR IN CODE: " + e.toString());
                // this is the line that prints out the location in the code where the error occurred.
                e.printStackTrace();
        }
       
        // GESTIONE LISTA PER AUTOCOMPLETAMENTO NUOVO PRODOTTO
        // Get a reference to the MultiAutoCompleteTextView in the layout
        textView = (MultiAutoCompleteTextView) findViewById(R.id.actProdotto);
        // Get the string array
        String[] prodottiComuni = getResources().getStringArray(R.array.prodotticomuni);
        // Create the adapter and set it to the MultiAutoCompleteTextView
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.prodotto_comune_li, prodottiComuni);
        textView.setAdapter(adapter);
        textView.setTokenizer(new SpaceTokenizer());
       
        txtNumProd = (TextView)findViewById(R.id.txtNumProd);
        txtNumDaTrovare = (TextView)findViewById(R.id.txtNumDaTrovare);
       
        // GESTIONE LISTA SPESA
        listaProdotti = new ArrayList<Prodotto>();
        newAdpt = new CustomListAdapter(this, R.layout.prodotto_lista, listaProdotti);
        setListAdapter(this.newAdpt);
       
        btnAggiungi = (ImageButton)findViewById(R.id.imbAggiungi);
        btnAggiungi.setOnClickListener(new OnClickListener() {
                public void onClick(View arg0) {
                        // se il nome del prodotto è valido
                        if (textView.getText().length() > 0) {
                                // inserimento nuovo prodotto
                                listaProdotti = new ArrayList<Prodotto>();
                                Prodotto info = new Prodotto();
                                info.setsNome(textView.getText().toString());
                                info.setbNelCarrello(false);
                                listaProdotti.add(info);
       
                                if (listaProdotti != null && listaProdotti.size() > 0){
                                        newAdpt.notifyDataSetChanged();
                                        newAdpt.add(listaProdotti.get(0));
                                        newAdpt.setiNumDaTrovare(newAdpt.getiNumDaTrovare() + 1);
                                        i++;
                                        textView.setText("");
                                       
                                        // Aggiornamento dettagli prodotti
                                        String sProd = "prodotti";
                                        String sDaTrovare = "da trovare";
                                        if (i == 1) {
                                                sProd = "prodotto";
                                        }
                                        txtNumProd.setText(i + " " + sProd);
                                        txtNumDaTrovare.setText(newAdpt.getiNumDaTrovare() + " " + sDaTrovare);
                                }
                                newAdpt.notifyDataSetChanged();
                        }
                }
        });
       
        //livProdotti = (ListView)findViewById(android.R.id.list);        
        /*getListView().setOnItemClickListener(new OnItemClickListener() {

                protected void onListItemClick(ListView l, View v, int position, long id) {
          // TODO Auto-generated method stub
          //super.onListItemClick(l, v, position, id);
         
          new AlertDialog.Builder(this)
           .setTitle("Hello")
           .setMessage("from " + getListView().getItemAtPosition(position))
           .setPositiveButton("OK",
             new DialogInterface.OnClickListener() {
              public void onClick(DialogInterface dialog, int which) {}}
             )
           .show();
         
          Toast.makeText(ListaSpesa.this,
            "ListView: " + l.toString() + "\n" +
            "View: " + v.toString() + "\n" +
            "position: " + String.valueOf(position) + "\n" +
            "id: " + String.valueOf(id),
            Toast.LENGTH_LONG).show();
         }             
               
                        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                                        long arg3) {
                                // TODO Auto-generated method stub
                               
                        }
                });*/



    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.lista_spesa, menu);
        return true;
    }
   
        /*protected void onListItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
                // TODO Auto-generated method stub
                // Aggiornamento dettagli prodotti
                String sProd = "prodotti";
                String sDaTrovare = "da trovare";
                if (i == 1) {
                        sProd = "prodotto";
                }
                txtNumProd.setText(i + " " + sProd);
                txtNumDaTrovare.setText(newAdpt.getiNumDaTrovare() + " " + sDaTrovare);
        }*/

   
    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
      AlertDialog alertDialog = new AlertDialog.Builder(this).create();
      alertDialog.setTitle("Item Selected");
      alertDialog.setMessage("You just clicked an item position #" + String.valueOf(position));
      alertDialog.setButton("OK",new DialogInterface.OnClickListener(){
        public void onClick(DialogInterface dialog, int which) {
        return;
      } });
      alertDialog.show();

      super.onListItemClick(getListView(), v, position, id);
    }
}
« Ultima modifica: 23 Luglio 2012, 09:41:24 CEST da UmbySlipKnot »

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Aggiornare TextView all'onclick su item di ListView personalizzata
« Risposta #1 il: 23 Luglio 2012, 09:47:47 CEST »
0
Per gestire i clic sugli elementi della lista c'è OnItemClickListener.

Questo è uno snippet un po' fuori dal contesto, ma rende l'idea:
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();
        }
});

Preso da: Android ListView and ListActivity - Tutorial
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline UmbySlipKnot

  • Nuovo arrivato
  • *
  • Post: 46
  • Respect: 0
    • Mostra profilo
Re:Aggiornare TextView all'onclick su item di ListView personalizzata
« Risposta #2 il: 23 Luglio 2012, 09:54:09 CEST »
0
Per gestire i clic sugli elementi della lista c'è OnItemClickListener.

Avevo già provato ma senza risultati, comunque ci riprovo ora.
Questo codice è da mettere in ListaSpesa.java giusto?
Per ottenere la variabile listView nel tuo esempio sopra scrivo findViewById(android.R.id.list)?
Grazie

Offline UmbySlipKnot

  • Nuovo arrivato
  • *
  • Post: 46
  • Respect: 0
    • Mostra profilo
Re:Aggiornare TextView all'onclick su item di ListView personalizzata
« Risposta #3 il: 23 Luglio 2012, 10:12:26 CEST »
0
Per gestire i clic sugli elementi della lista c'è OnItemClickListener.

Questo è uno snippet un po' fuori dal contesto, ma rende l'idea:
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();
        }
});

Preso da: Android ListView and ListActivity - Tutorial

Aggiungendo questo codice nella onCreate di ListaSpesa.java, al click sulla lista non accade nulla...
Codice (Java): [Seleziona]
        livProdotti = (ListView)findViewById(android.R.id.list);
        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();
                }
        });

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Aggiornare TextView all'onclick su item di ListView personalizzata
« Risposta #4 il: 23 Luglio 2012, 10:47:56 CEST »
0
Questo è uno snippet un po' fuori dal contesto, ma rende l'idea:
...
Preso da: Android ListView and ListActivity - Tutorial

Lo snippet era fuori dal contesto, giusto per indicarti quale era il listener nel caso di liste.

Nel link che ti ho indicato, c'è un esempio molto semplificato nel caso (come il tuo) in cui parti da ListActivity.
Di nuovo, lo copio brutalmente, ma ti consiglio di leggerti il tutorial, quanto meno per capire cosa stai copiando.
Codice (Java): [Seleziona]
public class MyListActivity extends ListActivity {
        public void onCreate(Bundle icicle) {
                super.onCreate(icicle);
                String[] values = new String[] { "Android", "iPhone", "WindowsMobile",
                                "Blackberry", "WebOS", "Ubuntu", "Windows7", "Max OS X",
                                "Linux", "OS/2" };
                ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                                android.R.layout.simple_list_item_1, values);
                setListAdapter(adapter);
        }

        @Override
        protected void onListItemClick(ListView l, View v, int position, long id) {
                String item = (String) getListAdapter().getItem(position);
                Toast.makeText(this, item + " selected", Toast.LENGTH_LONG).show();
        }
}
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline UmbySlipKnot

  • Nuovo arrivato
  • *
  • Post: 46
  • Respect: 0
    • Mostra profilo
Re:Aggiornare TextView all'onclick su item di ListView personalizzata
« Risposta #5 il: 23 Luglio 2012, 10:59:46 CEST »
0
Lo snippet era fuori dal contesto, giusto per indicarti quale era il listener nel caso di liste.

Nel link che ti ho indicato, c'è un esempio molto semplificato nel caso (come il tuo) in cui parti da ListActivity.
Di nuovo, lo copio brutalmente, ma ti consiglio di leggerti il tutorial, quanto meno per capire cosa stai copiando.
Codice (Java): [Seleziona]
public class MyListActivity extends ListActivity {
        public void onCreate(Bundle icicle) {
                super.onCreate(icicle);
                String[] values = new String[] { "Android", "iPhone", "WindowsMobile",
                                "Blackberry", "WebOS", "Ubuntu", "Windows7", "Max OS X",
                                "Linux", "OS/2" };
                ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                                android.R.layout.simple_list_item_1, values);
                setListAdapter(adapter);
        }

        @Override
        protected void onListItemClick(ListView l, View v, int position, long id) {
                String item = (String) getListAdapter().getItem(position);
                Toast.makeText(this, item + " selected", Toast.LENGTH_LONG).show();
        }
}

Sì sì infatti ho adattato l'esempio al mio contesto.
Comunque le sto tentando tutte, nemmeno con la "protected void onListItemClick" funziona...
Sto guardando mille risorse e ho scaricato un esempio con lista personalizzata e quello funziona, ma col mio codice nulla da fare per ora...