Autore Topic: Cambiare colore della textView di una listview al click - Problema  (Letto 3310 volte)

Offline Ray13

  • Utente junior
  • **
  • Post: 65
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows 7
0
Salve ragazzi io vorrei una cosa molto molto semplice.

Ho una lista di item con textView e immagini. Al click sull'elemento numero X vorrei che la textView alla posizione X cambi colore.

Ho scritto

Codice (Java): [Seleziona]
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                if(position == 3){
                        TextView txtQuestion = (TextView)listView.getChildAt(3).findViewById(R.id.question);
                        txtQuestion.setTextColor(Color.GREEN);
                                          }
                 }

e così via per tutte le posizioni.

Funziona tutto, il mio problema? E' che se cambio colore all'elemento numero 3 mi colora anche l'elemento numero 11 e l'elemento numero 20 e così via. Mi riconosce come posizione la posizione nella lista di 9 item che si ripetono. Quindi alla posizione 18 della lista per lui è sempre la posizione 9... Qualcuno sa come risolvere?
« Ultima modifica: 12 Gennaio 2013, 03:25:32 CET da Ray13 »

Offline Ray13

  • Utente junior
  • **
  • Post: 65
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Cambiare colore della textView di una listview al click - Problema
« Risposta #1 il: 13 Gennaio 2013, 02:03:35 CET »
0
up

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
R: Cambiare colore della textView di una listview al click - Problema
« Risposta #2 il: 13 Gennaio 2013, 11:54:45 CET »
0
Che adapter stai utilizzando?

Inviato dal mio Galaxy Nexus con Tapatalk 2


Offline Ray13

  • Utente junior
  • **
  • Post: 65
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Cambiare colore della textView di una listview al click - Problema
« Risposta #3 il: 13 Gennaio 2013, 16:10:33 CET »
0
Uso un baseAdapter. Li infatti ho un'altro problema che magari chiederò poi... Nel base Adapter: quando esci e rientri controllo il riempimento di una lista e a seconda di quali stringhe sono presenti cambio il colore verde in modo che se un utente esce e rientra comunque il colore verde deve essere cambiato.

Offline mdb

  • Nuovo arrivato
  • *
  • Post: 43
  • Respect: +7
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Play Store ID:
    Prometheo Apps
  • Sistema operativo:
    Windows
Re:Cambiare colore della textView di una listview al click - Problema
« Risposta #4 il: 13 Gennaio 2013, 21:09:39 CET »
0
Funziona tutto, il mio problema? E' che se cambio colore all'elemento numero 3 mi colora anche l'elemento numero 11 e l'elemento numero 20 e così via. Mi riconosce come posizione la posizione nella lista di 9 item che si ripetono.
Tieni presente che la ListView ricicla le view degli item, per motivi di efficienza.
Quando quello che indichi come "numero 3", sparisce dallo schermo, la sua view viene riutilizzata per mostrare il nuovo item che sta entrando nel campo di visualizzazione.

Per cui se cambi il colore di un oggetto,
devi poi nella getView dell'adapter rimettere a posto il colore originale.
 :-)
App per Android:
Almanacco: Giorno per giorno, eventi, notizie, giochi e curiosità, da leggere e condividere
Proverbi Napoletani: Più di 50 proverbi da ascoltare in dialetto napoletano. Due sottofondi musicali.

Offline Ray13

  • Utente junior
  • **
  • Post: 65
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Cambiare colore della textView di una listview al click - Problema
« Risposta #5 il: 13 Gennaio 2013, 23:03:53 CET »
0
Non volevo dirlo subito ma questo è proprio il mio problema dell'adapter. Siccome io cambio il colore della textview in posizione 3 poi la posizione 12 ecc... si colorano di verde quando scorri la listview.

c'è un modo per evitarlo?

Offline mdb

  • Nuovo arrivato
  • *
  • Post: 43
  • Respect: +7
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Play Store ID:
    Prometheo Apps
  • Sistema operativo:
    Windows
Re:Cambiare colore della textView di una listview al click - Problema
« Risposta #6 il: 14 Gennaio 2013, 01:02:47 CET »
0
Non volevo dirlo subito ma questo è proprio il mio problema dell'adapter. Siccome io cambio il colore della textview in posizione 3 poi la posizione 12 ecc... si colorano di verde quando scorri la listview.

c'è un modo per evitarlo?
Devi creare una tua sottoclasse dell'adapter e fare un override della getview, che prima di riciclare una view, rimette a posto il colore.
Una cosa tipo questa (codice scritto al volo, NON testato):

Codice: [Seleziona]
@Override
public View getView(int position, View convertView, ViewGroup parent){
    if(convertView!=null){
         TextView txt= (TextView)convertView.findViewById(R.id.question);
         txt.setTextColor(COLORE_INIZIALE);
    }
    return super(position, convertView, parent);
}
il codice controlla se c'è una view da riciclare, se sì, imposta il colore a quello normale,
e poi fa fare il resto del lavoro alla normale getView.
App per Android:
Almanacco: Giorno per giorno, eventi, notizie, giochi e curiosità, da leggere e condividere
Proverbi Napoletani: Più di 50 proverbi da ascoltare in dialetto napoletano. Due sottofondi musicali.

Offline Ray13

  • Utente junior
  • **
  • Post: 65
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Cambiare colore della textView di una listview al click - Problema
« Risposta #7 il: 14 Gennaio 2013, 02:03:53 CET »
0
Credo che dovrebbe funzionare ma la classe deve estendere il mio adapter o c'è bisogno di chiamarla dal mio adapter? Non capisco come collegare il mio adapter alla mia sottoclasse nuova

Offline mdb

  • Nuovo arrivato
  • *
  • Post: 43
  • Respect: +7
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Play Store ID:
    Prometheo Apps
  • Sistema operativo:
    Windows
Re:Cambiare colore della textView di una listview al click - Problema
« Risposta #8 il: 14 Gennaio 2013, 02:13:09 CET »
0
Credo che dovrebbe funzionare ma la classe deve estendere il mio adapter o c'è bisogno di chiamarla dal mio adapter? Non capisco come collegare il mio adapter alla mia sottoclasse nuova
Se non hai ancora una tua classe adapter ma usi una di quelle standard
devi creare una tua sottoclasse e dentro ci metti la tua getview

Ad esempio crei
class MioAdapter extends ArrayAdapter<String>{
...
}
App per Android:
Almanacco: Giorno per giorno, eventi, notizie, giochi e curiosità, da leggere e condividere
Proverbi Napoletani: Più di 50 proverbi da ascoltare in dialetto napoletano. Due sottofondi musicali.

Offline Ray13

  • Utente junior
  • **
  • Post: 65
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Cambiare colore della textView di una listview al click - Problema
« Risposta #9 il: 14 Gennaio 2013, 02:24:46 CET »
0
Ok, ho risolto. Dentro il mio adapter all'interno del metodo scritto da te ho semplicemente aggiunto:

Codice (Java): [Seleziona]
        if(convertView!=null){
            TextView txt= (TextView)convertView.findViewById(R.id.question);
            txt.setTextColor(Color.BLACK);
       }

Testato e funziona. Ho solo il problema iniziale ora.

Io scrivo nella classe dell'activity nel metodo onItemClick questo:

Codice (Java): [Seleziona]
  public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if(position == 0){//controlla la posizione

                                                TextView txtQuestion = (TextView)listView.getChildAt(0).findViewById(R.id.question);
                                        txtQuestion.setTextColor(Color.GREEN);

                                        }    

Il problema è che quando clicco sulle prime visibili funziona tutto. Sull'ultima colora altre sbagliate e se clicco per esempio scorrendo sulla 12esima crasha l'applicazione...

Idee? XD

Offline mdb

  • Nuovo arrivato
  • *
  • Post: 43
  • Respect: +7
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Play Store ID:
    Prometheo Apps
  • Sistema operativo:
    Windows
Re:Cambiare colore della textView di una listview al click - Problema
« Risposta #10 il: 14 Gennaio 2013, 12:00:18 CET »
0
Codice (Java): [Seleziona]
  public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if(position == 0){//controlla la posizione

                                                TextView txtQuestion = (TextView)listView.getChildAt(0).findViewById(R.id.question);
                                        txtQuestion.setTextColor(Color.GREEN);

                                        }    

Il problema è che quando clicco sulle prime visibili funziona tutto. Sull'ultima colora altre sbagliate e se clicco per esempio scorrendo sulla 12esima crasha l'applicazione...

Idee? XD
il problema è che position non corrisponde ad un indice utilizzabile in getChildAt.
position corrisponde all'indice nella tua lista gestita dall'adapter,
getChildAt invece è relativa alle view presenti nella ListView e la ListView contiene SOLO gli elementi visualizzati in quel momento
nel tuo adapter ci possono essere ad esempio 100 elementi, ma la ListView può contenerne solo 10.

Il problema si risolve semplicemente, onItemClick ti passa direttamente la view interessata,
non devi andarla a cercare, per cui puoi scrivere direttamente:
Codice: [Seleziona]
TextView txtQuestion = (TextView)view.findViewById(R.id.question);
App per Android:
Almanacco: Giorno per giorno, eventi, notizie, giochi e curiosità, da leggere e condividere
Proverbi Napoletani: Più di 50 proverbi da ascoltare in dialetto napoletano. Due sottofondi musicali.

Offline Ray13

  • Utente junior
  • **
  • Post: 65
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Cambiare colore della textView di una listview al click - Problema
« Risposta #11 il: 14 Gennaio 2013, 13:27:03 CET »
0
Scusami ci ho messo un po' per rispondere che ho voluto ri-verificare.

Purtroppo se sostituisco semplicemente con:

Codice (Java): [Seleziona]
        TextView txtQuestion = (TextView)findViewById(R.id.question);
All'interno dell'if con la posizione qualsiasi view che clicco mi colora sempre e solo la prima view. Già avevo provato così, per questo mi ero buttato sul getChild

Offline Ray13

  • Utente junior
  • **
  • Post: 65
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Cambiare colore della textView di una listview al click - Problema
« Risposta #12 il: 14 Gennaio 2013, 13:33:22 CET »
0
Mi sono appena accorto inoltre che se clicco per esempio la posizione 2 me la colora. Poi se clicco la 11 (corrispettiva della 2) dopo aver cliccato la due non me la colora perchè riconosce che esiste una CustomView quindi la rimette del colore originale... Strano ma vero sto su questo problema da settimane...

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Cambiare colore della textView di una listview al click - Problema
« Risposta #13 il: 14 Gennaio 2013, 14:22:28 CET »
0
Ho fatto una piccola prova e sembra funzionare. Ti spiego la mia idea: sostanzialmente si tratta di utilizzare la modalità ListView.CHOICE_MODE_MULTIPLE in modo tale che sia la ListView stessa a gestire le righe che devono essere selezionate o meno. In questo modo tu non devi preoccuparti di intercettare il click e cambiare il colore della textview.

La modalità ListView.CHOICE_MODE_MULTIPLE però richiede che la View che usi come riga implementi l'interfaccia Checkable.
Ho quindi realizzato una custom textview che implementa appunto l'interfaccia Checkable e imposta il colore del testo a seconda che debba essere checked o meno.

Codice (Java): [Seleziona]
package com.example.test;

import android.content.Context;
import android.graphics.Color;
import android.util.AttributeSet;
import android.widget.Checkable;
import android.widget.TextView;

public class CustomTextView extends TextView implements Checkable {

        boolean isChecked = false;

        public CustomTextView(Context context, AttributeSet attrs) {
                super(context, attrs);
        }

        public CustomTextView(Context context) {
                super(context);
        }

        public CustomTextView(Context context, AttributeSet attrs, int defStyle) {
                super(context, attrs, defStyle);
        }

        @Override
        public boolean isChecked() {
                return isChecked;
        }

        @Override
        public void setChecked(boolean checked) {
                isChecked = checked;
                if (checked) {
                        this.setTextColor(Color.GREEN);
                } else {
                        this.setTextColor(Color.BLACK);
                }

        }

        @Override
        public void toggle() {
                setChecked(!isChecked);
        }

}

A questo punto la gestione della listview si limita a:

Codice (Java): [Seleziona]
        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);

                ListView listView = (ListView) findViewById(R.id.listView1);
                ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                                R.layout.row_item, Cheeses.sCheeseStrings);
                listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
                listView.setAdapter(adapter);
        }

e il file row_item.xml

Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<com.example.test.CustomTextView xmlns:android="http://schemas.android.com/apk/res/android"
   android:id="@android:id/text1"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:padding="5dip"
   android:textAppearance="?android:attr/textAppearanceLarge" />

Ti allego il progetto


Offline Ray13

  • Utente junior
  • **
  • Post: 65
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Cambiare colore della textView di una listview al click - Problema
« Risposta #14 il: 14 Gennaio 2013, 17:40:40 CET »
0
Ci sto provando da un po' ma non funziona. O meglio. Ti spiego cosa ho fatto:

Creato la nuova classe su un nuovo file. Aggiunto la CustomTextView nel layout e infatti compare.
Aggiunto a fine onCreate come te solo la riga

Codice (Java): [Seleziona]
                listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
Ma al click non succede niente alla scritta CustomTextView