Autore Topic: ListView.setOnItemClickListener con liste personalizzate  (Letto 1322 volte)

Offline spode

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    MyTab (Android 2.1)
  • Sistema operativo:
    Windows 7 32 bit Ultimate edition
ListView.setOnItemClickListener con liste personalizzate
« il: 01 Febbraio 2012, 11:27:30 CET »
0
Salve a tutti e complimenti per il forum: italiano e con buona grafica! ;)
Ho questo problema: creo una lista personalizzata. logicamente il ListView.setOnItemClickListener non risponde, così ho fatto qualche ricerca e ho trovato che avrei potuto usare android:onClick="nomeFunzione(View arg1)":

Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>

        <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:id="@+id/parent"
   >
                <TextView
                        android:textSize="23dp"
                        android:inputType="text"
                        android:id="@+id/parolawort"
                                android:layout_width="fill_parent"
                                android:layout_height="wrap_content"
                                android:singleLine="true"
                                android:gravity="center_horizontal"
                                android:focusable="false"
                                android:focusableInTouchMode="false"
                                android:clickable="false"
                                android:onClick="changeItemText(View target)"
                />
                    <TextView
                        android:textSize="18dp"
                        android:inputType="text"
                        android:id="@+id/esempiobeispiel"
                                android:layout_width="fill_parent"
                                android:layout_height="wrap_content"
                                android:focusable="false"
                                android:focusableInTouchMode="false"
                                android:singleLine="true"
                                android:gravity="center_horizontal"
                                android:ellipsize="marquee"
                                android:clickable="false"
                     />
            </LinearLayout>

Il problema è che non so quale posizione è stata cliccata nella lista e di conseguenza non so che testo cambiare

Codice (Java): [Seleziona]
private void changeItemText(View arg1)
        {
                if(arg1.getId() == R.id.parolawort)
                        scrivi(166, "a listview's element was clicked");
                        TextView txt_wortparola = (TextView) arg1.findViewById(R.id.parolawort);
                        TextView txt_beispielesempio = (TextView) arg1.findViewById(R.id.esempiobeispiel);
                        Bigliettino bigliettino_corrente = listaBigliettini.get(arg1);
               
                        scrivi(171, "txt_wortparola = " + txt_wortparola.toString() + "; bigliettino_corrente = " + bigliettino_corrente.getWort());
                        if(txt_wortparola.getText().equals(bigliettino_corrente.getWort()))
                        {
                                System.out.println("true");
                                txt_wortparola.setText(bigliettino_corrente.getParola());
                        txt_beispielesempio.setText(bigliettino_corrente.getEsempio());
                        }
                        else
                        {
                                txt_wortparola.setText(bigliettino_corrente.getWort());
                        txt_beispielesempio.setText(bigliettino_corrente.getBeispiel());
                        }
                }
        }

mi date qualche dritta per favore?

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:ListView.setOnItemClickListener con liste personalizzate
« Risposta #1 il: 01 Febbraio 2012, 13:52:35 CET »
0
una text view non va gestita come una lista! la text view è come una label, testo semplice!
non ho capito perchè non puoi usare una listview
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline spode

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    MyTab (Android 2.1)
  • Sistema operativo:
    Windows 7 32 bit Ultimate edition
Re:ListView.setOnItemClickListener con liste personalizzate
« Risposta #2 il: 01 Febbraio 2012, 19:01:57 CET »
0
il file xml è un delegato della struttura di quella lista. appare come testo e testo, in verticale, per ogni elemento della lista.
aspetta ora ti faccio vedere che cosa ho fatto  ;-)

file sub_activity_3.java
Codice (Java): [Seleziona]
package android.Spode.HUVWSZE;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.ArrayList;

import android.Spode.HUVWSZE.altre.Bigliettino;
import android.Spode.HUVWSZE.altre.DoubleRowAdapter;
import android.app.Activity;
import android.app.AlertDialog;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;

public class Sub_Activity_3 extends Activity
{

        private ArrayList<Bigliettino> listaBigliettini = new ArrayList<Bigliettino>();

        public void onCreate(Bundle savedInstanceState)
        {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.schermata3);

                //salvataggio dei componenti di interazione
                Button btt_indietro = (Button) findViewById(R.id.button1);
                btt_indietro.setOnClickListener(new View.OnClickListener()
                {
                        public void onClick(View arg0)
                        {
                                goto1();
                        }
                });
                Button btt_newBiglietto = (Button) findViewById(R.id.button2);
                btt_newBiglietto.setOnClickListener(new View.OnClickListener()
                {
                        public void onClick(View arg0)
                        {
                                goto4();
                        }
                });


                compilaListaBigliettini();

                inizializzaListaBigliettini();

    }



        @SuppressWarnings("unused")
        private void changeItemText(View arg1)
        {
                scrivi(66, "here");
                if(arg1.getId() == R.id.parolawort)
                {
                        scrivi(166, "a listview's element was clicked");
                        TextView txt_wortparola = (TextView) arg1.findViewById(R.id.parolawort);
                        TextView txt_beispielesempio = (TextView) arg1.findViewById(R.id.esempiobeispiel);
                        Bigliettino bigliettino_corrente;
                        int i = 0;
                        do
                        {
                                bigliettino_corrente = listaBigliettini.get(i);
                                if(bigliettino_corrente.getWort().equals(txt_wortparola.getText()) && bigliettino_corrente.getBeispiel().equals(txt_beispielesempio.getText()))
                                {
                                        txt_wortparola.setText(bigliettino_corrente.getParola());
                                        txt_beispielesempio.setText(bigliettino_corrente.getEsempio());
                                }
                                else if(bigliettino_corrente.getParola().equals(txt_wortparola.getText()) && bigliettino_corrente.getEsempio().equals(txt_beispielesempio.getText()))
                                {
                                        txt_wortparola.setText(bigliettino_corrente.getWort());
                                        txt_beispielesempio.setText(bigliettino_corrente.getBeispiel());
                                }
                                else i++;
                        }
                        while(i < listaBigliettini.size());

                        scrivi(171, "txt_wortparola = " + txt_wortparola.toString() + "; bigliettino_corrente = " + bigliettino_corrente.getWort());
                        if(txt_wortparola.getText().equals(bigliettino_corrente.getWort()))
                        {
                                System.out.println("true");
                                txt_wortparola.setText(bigliettino_corrente.getParola());
                        txt_beispielesempio.setText(bigliettino_corrente.getEsempio());
                        }
                        else
                        {
                                txt_wortparola.setText(bigliettino_corrente.getWort());
                        txt_beispielesempio.setText(bigliettino_corrente.getBeispiel());
                        }
                }
        }


        @SuppressWarnings("null")
        private void compilaListaBigliettini()
        {
                //riempimento della lista
                BufferedReader streami = null;
                try
                {
                        streami = new BufferedReader(new InputStreamReader(new FileInputStream(General.getPath())));
                }
                catch (FileNotFoundException e1)
                {
                        e1.printStackTrace();
                }
                String riga = "";
                String [] parti;
                try
                {
                        while((riga = streami.readLine()) != null)
                        {
                                System.out.println("3 - Linea104: riga e lingue: " + riga + "; "+General.getLingua1() + " <-> " + General.getLingua2());
                                if(riga.equals(General.getLingua1() + " <-> " + General.getLingua2()))
                                {
                                        try
                                        {
                                                riga = streami.readLine();

                                                if(riga == null || riga.contains(" <-> "))//se la sezione non ha biglietti
                                                {
                                                        scrivi(113, "riga è null");
                                                        scrivi(114, "" + listaBigliettini.add(new Bigliettino("Perchè non inserisci un biglietto?", "", "", "", "")));
                                                        break;
                                                }

                                                while(riga != null || !riga.contains(" <-> "))
                                                {
                                                        parti = this.split(riga);
                                                        scrivi(88, ""+parti.length);
                                                        if(parti.length == 5)
                                                        {
                                                                scrivi(124, "comincio la compilazione del bigliettino");
                                                                listaBigliettini.add(new Bigliettino(parti[0], parti[1], parti[2], parti[3], parti[4]));
                                                                scrivi(126, "fine biglietto");
                                                                riga = streami.readLine();
                                                                if(riga == null) break;
                                                                scrivi(128, "lunghezza di riga " + riga.length());
                                                        }
                                                        else break;

                                                        if(riga.length() == 0) break;;
                                                }
                                                break;
                                        }
                                        catch (IOException e)
                                        {
                                                e.printStackTrace();
                                        }
                                }
                                else continue;
                        }
                        streami.close();
                }
                catch (IOException e)
                {
                        e.printStackTrace();
                }
        }


        @SuppressWarnings("null")
        private void deleteBigliettino(String beispielDaCancellare, String wortDaCancellare)
        {
                String nuovoContenuto = null, riga = null;
                BufferedReader streami = null;
                try
                {
                        streami = new BufferedReader(new InputStreamReader(new FileInputStream(General.getPath())));
                }
                catch (FileNotFoundException e)
                {
                        e.printStackTrace();
                }
                try
                {
                        while((riga = streami.readLine()) != null)
                        {
                                if(! (riga.contains(beispielDaCancellare) && riga.contains(wortDaCancellare)) )
                                {
                                        nuovoContenuto.concat(riga);
                                }
                                else
                                {
                                        continue;
                                }
                        }
                        streami.close();

                        PrintWriter streamo = new PrintWriter(General.getPath());
                        streamo.write(nuovoContenuto.replaceAll("null", ""));
                        streamo.close();
                }
                catch (IOException e)
                {
                        e.printStackTrace();
                }
        }

        public void goto1()
        {
                Intent intent = new Intent(this, HilfeUmVieleWorterSichZuErinnernActivity.class);
                this.startActivity(intent);
                this.finish();
        }

        public void goto4()
        {
                Intent intent = new Intent(this, Sub_Activity_4.class);
                this.startActivity(intent);
                this.finish();
        }

        private void inizializzaListaBigliettini()
        {
                scrivi(206, "setting della lista");
        ListView lv = (ListView)findViewById(R.id.listView1);
        lv.setItemsCanFocus(true);
        DoubleRowAdapter adapter = new DoubleRowAdapter(getApplicationContext(), listaBigliettini);
        lv.setAdapter(adapter);
                //END riempimento della lista
        lv.setOnItemLongClickListener(new OnItemLongClickListener()
        {
                        public boolean onItemLongClick(AdapterView<?> arg0, View arg1, final int arg2, long arg3)
                        {
                                AlertDialog.Builder confirmDelete = new AlertDialog.Builder(getApplicationContext());
                                confirmDelete.setTitle("Conferma la cancellazione");
                                confirmDelete.setMessage("Si vuole veramente cancellare il biglietto di\n\"" + listaBigliettini.get(arg2).getWort() + "\"?");

                                confirmDelete.setNegativeButton("Annulla", new OnClickListener()
                                {
                                        public void onClick(DialogInterface arg0, int arg1)
                                        {
                                                arg0.cancel();
                                        }
                                });

                                confirmDelete.setPositiveButton("Conferma", new OnClickListener()
                                {
                                        public void onClick(DialogInterface dialog, int which)
                                        {
                                                deleteBigliettino(listaBigliettini.get(arg2).getBeispiel(), listaBigliettini.get(arg2).getWort());
                                        }
                                });
                                confirmDelete.show();

                                return false;
                        }
        });
        }

        private void scrivi(int nriga, String msg)
        {
                System.out.println("3 - " + nriga + ": " + msg);
        }

        private String[] split(String s)
        {
                scrivi(255, "s = \"" + s + "\"");
                String[] parti = new String[]{ "", "", "", "", "" };
                int neuIndex, altIndex, i;
                neuIndex = altIndex = 0;
                i = -1;
                scrivi(260, "s.charAt" + neuIndex + " = \"" + s.charAt(neuIndex) + "\"");

                while(s.charAt(neuIndex) != '\0')
                {
                        scrivi(264, "inizio");
                        i ++;

                        while(s.charAt(neuIndex) != '|')
                        {
                                scrivi(269, "neuIndex = "+neuIndex);
                                neuIndex ++;
                        }

                        if(s.charAt(neuIndex) == '|' && s.charAt(neuIndex + 1) == '|')
                        {
                                scrivi(275, "fine cicli");
                                parti[i] = s.substring(altIndex, neuIndex);
                                break;
                        }

                        parti[i] = s.substring(altIndex, neuIndex).replaceAll("|", "").trim();
                        scrivi(281, "parti["+i+"] = " + parti[i] + " neuindex e altindex e i = "+ neuIndex + " " + altIndex + " " + i);
                        neuIndex ++;
                        altIndex = neuIndex;
                        scrivi(284, "fine: neuIndex e altIndex = " + neuIndex + " " + altIndex);
                }
                scrivi(286, "i = " + i + "; parti[" + i + "] = " + parti[i]);
                return parti;
        }
}

file Bigliettino.java
Codice: [Seleziona]
package android.Spode.HUVWSZE.altre;

import android.content.Context;

public class Bigliettino
{
private String wort, beispiel, parola, esempio, tipo;
        public Bigliettino(String newTipo, String newWort, String newBeispiel, String newParola, String newEsempio)
        {
                System.out.println("bigliettino.java - " + 10 + ": " + "creazione di un bigliettino: newWort = " + newWort + "; newBeispiel = " + newBeispiel + "; newParola = " + newParola + "; newEsempio = " + newEsempio + "; newTipo = " + newTipo);
                wort = newWort;
                beispiel = newBeispiel;
                parola = newParola;
                esempio = newEsempio;
                tipo = newTipo;
                System.out.println("bigliettino.java - " + 16 + ": " + this.getAllAsString());
        }

        public Bigliettino(Context context)
        {
                wort = beispiel = parola = esempio = tipo = "";
        }

        public Bigliettino()
        {
                wort = beispiel = parola = esempio = tipo = "";
        }


        public boolean is(String parteGrammaticale)
        {
                if(parteGrammaticale.equals(wort.split(" ")))
                        return true;
                else
                        return false;
        }

        public String[] getAll()
        {
                return new String[] { wort, beispiel, parola, esempio, tipo };
        }

        public String getAllAsString()
        {
                String space = " ";
                return space + wort + space + beispiel + space + parola + space + esempio + space + tipo;
        }

        public String getWort()
        {
                System.out.println("wort: " + wort);
                return wort;
        }

        public String getBeispiel()
        {
                return beispiel;
        }

        public String getParola()
        {
                return parola;
        }

        public String getEsempio()
        {
                return esempio;
        }

        public String getParteGrammaticale()
        {
                return tipo;
        }
}

file doublerowdelegate.java
Codice (Java): [Seleziona]
package android.Spode.HUVWSZE.altre;

import java.util.List;

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

public class DoubleRowAdapter extends ArrayAdapter<Bigliettino>
{
        private Context contextCorrente;

        private List<Bigliettino> listaBiglietti;

        public DoubleRowAdapter(Context context, List<Bigliettino> objects)
        {
                super(context, R.layout.listamultilinedelegate, objects);
                contextCorrente = context;
                listaBiglietti = objects;
        }

        public int getCount() {
                return listaBiglietti.size();
        }

        public Bigliettino getItem(int arg0) {
                return listaBiglietti.get(arg0);
        }

        public long getItemId(int arg0) {
                return listaBiglietti.get(arg0).hashCode();
        }

        public void changeDataAt(int position, View convertView)
        {
                TextView testoSopra = (TextView) convertView.findViewById(R.id.parolawort);
                TextView testoSotto = (TextView) convertView.findViewById(R.id.esempiobeispiel);

                String[] contenutoBigliettoCorrente = listaBiglietti.get(position).getAll();
                if(testoSopra.toString().equals(contenutoBigliettoCorrente[2]))
                {
                        testoSopra.setText(contenutoBigliettoCorrente[0]);
                        testoSotto.setText(contenutoBigliettoCorrente[1]);
                }
                else
                {
                        testoSopra.setText(contenutoBigliettoCorrente[2]);
                        testoSotto.setText(contenutoBigliettoCorrente[3]);
                }
        }

        public View getView(int position, View convertView, ViewGroup parent)
        {
                View v = convertView;
                if(v == null)
                {
                        LayoutInflater inflater = (LayoutInflater)contextCorrente.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                        v = inflater.inflate(R.layout.listamultilinedelegate, null);
                }

                v.setFocusable(true);
                v.setClickable(true);
               
                //modificare qua : [url=http://stackoverflow.com/questions/6090666/onitemclicklistener-and-onclicklistener-in-listview]android - OnItemClickListener and OnClickListener in ListView - Stack Overflow[/url]
               
                 Bigliettino biglietto = listaBiglietti.get(position);
                 if(biglietto != null)
                 {
                         TextView testoSopra = (TextView)v.findViewById(R.id.parolawort);
                         TextView testoSotto = (TextView)v.findViewById(R.id.esempiobeispiel);
                         if(testoSopra != null)
                         {
                                 testoSopra.setText(biglietto.getWort());
                         }
                         if(testoSotto != null)
                         {
                                 testoSotto.setText(biglietto.getBeispiel());
                         }
                 }
                 return v;
        }

}

file listamultinedelegate.xml
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>

        <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:id="@+id/parent"
   >
                <TextView
                        android:textSize="23dp"
                        android:inputType="text"
                        android:id="@+id/parolawort"
                                android:layout_width="fill_parent"
                                android:layout_height="wrap_content"
                                android:singleLine="true"
                                android:gravity="center_horizontal"
                                android:onClick="changeItemText(View arg1)"
                />
                    <TextView
                        android:textSize="18dp"
                        android:inputType="text"
                        android:id="@+id/esempiobeispiel"
                                android:layout_width="fill_parent"
                                android:layout_height="wrap_content"
                                android:singleLine="true"
                                android:gravity="center_horizontal"
                                android:ellipsize="marquee"
                                android:onClick="changeItemText(View arg1)"
                     />
            </LinearLayout>

   

Offline Verandi

  • Utente normale
  • ***
  • Post: 378
  • Respect: +75
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:ListView.setOnItemClickListener con liste personalizzate
« Risposta #3 il: 01 Febbraio 2012, 19:31:39 CET »
0
Ciao! Premetto che non ho letto tutto il codice.  :-P
Cosa intendi con "l'itemClickListener non risponde"?  Non basta che nell'onItemClick() del listener tu faccia un view.findViewById(R.id.parolawort), dove view è il linearLayout della riga che ti viene passato come parametro?

Offline spode

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    MyTab (Android 2.1)
  • Sistema operativo:
    Windows 7 32 bit Ultimate edition
Re:ListView.setOnItemClickListener con liste personalizzate
« Risposta #4 il: 01 Febbraio 2012, 19:35:47 CET »
0
e come faccio a sapere quale istanza della lista devo modificare?
« Ultima modifica: 01 Febbraio 2012, 19:38:47 CET da spode »

Offline Verandi

  • Utente normale
  • ***
  • Post: 378
  • Respect: +75
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:ListView.setOnItemClickListener con liste personalizzate
« Risposta #5 il: 01 Febbraio 2012, 19:38:03 CET »
0
Cosa vuoi dire?

Offline spode

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    MyTab (Android 2.1)
  • Sistema operativo:
    Windows 7 32 bit Ultimate edition
Re:ListView.setOnItemClickListener con liste personalizzate
« Risposta #6 il: 01 Febbraio 2012, 19:38:57 CET »
0
all' inizio avevo fatto come dici tu, però poi mi sono accorto del fatto che non viene richiamato l' onitemclick. me ne sono accorto perchè non compariva il log che avevo inserito a inizio funzione.

Offline Verandi

  • Utente normale
  • ***
  • Post: 378
  • Respect: +75
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:ListView.setOnItemClickListener con liste personalizzate
« Risposta #7 il: 01 Febbraio 2012, 19:46:58 CET »
0
Forse c'era qualche errore, perché l'itemClickListener funziona anche con le listView personalizzate (E' un'interfaccia).  :D
Tra l'altro immagino che quell'onLongItemClickListener che hai nel codice funzioni, no?  ;-)

Offline spode

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    MyTab (Android 2.1)
  • Sistema operativo:
    Windows 7 32 bit Ultimate edition
Re:ListView.setOnItemClickListener con liste personalizzate
« Risposta #8 il: 01 Febbraio 2012, 20:16:14 CET »
0
non funziona...  O:-)

Offline Verandi

  • Utente normale
  • ***
  • Post: 378
  • Respect: +75
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:ListView.setOnItemClickListener con liste personalizzate
« Risposta #9 il: 01 Febbraio 2012, 22:00:57 CET »
0
Prova a togliere il setItemsCanFocus.

Offline spode

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    MyTab (Android 2.1)
  • Sistema operativo:
    Windows 7 32 bit Ultimate edition
Re:ListView.setOnItemClickListener con liste personalizzate
« Risposta #10 il: 03 Febbraio 2012, 15:43:38 CET »
0
niente...  :-(

Offline spode

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    MyTab (Android 2.1)
  • Sistema operativo:
    Windows 7 32 bit Ultimate edition
Re:ListView.setOnItemClickListener con liste personalizzate
« Risposta #11 il: 04 Febbraio 2012, 12:11:16 CET »
0
Codice (Java): [Seleziona]
protected void onListItemClick(ListView l, View v, int position, long id) {

    super.onListItemClick(l, v, position, id);
    Object o = this.getListAdapter().getItem(position);
    String pen = o.toString();
    Toast.makeText(this, "You have chosen the pen: " + " " + pen, Toast.LENGTH_LONG).show();
}