Autore Topic: RelativeLayout Checkable TextView cambio colore  (Letto 1250 volte)

Offline Ray13

  • Utente junior
  • **
  • Post: 65
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows 7
RelativeLayout Checkable TextView cambio colore
« il: 02 Marzo 2013, 22:22:37 CET »
0
Salve ragazzi.
Mi sono accorto dopo tanto tempo di un problema

Vorrei che al click la textView presente nell'item della mia lista di domande cambi colore. Vorrei che cambi solo quella e non tutte le view in quella posizione. E vorrei inoltre che se ci riclicco non torna come prima.

Avevo risolto tutto tempo fa qui:

Cambiare colore della textView di una listview al click - Problema - Android Developers Italia

Ma ho scoperto che se riclikko sullo stesso item mi ritorna del colore originale.

Ho un relativeLayout a parte così:

Codice (Java): [Seleziona]
public class CheckableRelativeLayout extends RelativeLayout implements
                Checkable {

        public CheckableRelativeLayout(Context context, AttributeSet attrs) {
                super(context, attrs);

                // TODO Auto-generated constructor stub
        }

        private boolean isChecked;
        private TextView target;

        @Override
        protected void onFinishInflate() {
                super.onFinishInflate();
                target = (TextView) findViewById(R.id.question);
        }

        public boolean isChecked() {
                return isChecked;
        }

        public void setChecked(boolean checked) {
                isChecked = checked;

                if(checked == true) {
                        target.setTextColor(Color.GREEN);
                       
                }
                        if(checked == false ){
                        target.setTextColor(Color.BLACK);
                       
                }
        }

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

}

Funziona tutto. Ovvero se clicco una volta mi diventa verde la mia textView. Se ci riclicco però diventa nera mentre vorrei che restasse verde. Se ometto la parte in cui controllo il checked false mi colora di verde tutti gli item alla posizione cliccata. Chesso io vedo 9 item e clicco la 3°. mi colora la 3 e la 12 e la 21 ecc...

Idee?

ah, nell'activity di dove creo la listview ovviamente controllo una mia lista che riempio al click in modo che se esci e rientri si ricorda tutte le clikkate e le colora di verde. In questo modo:

Codice (Java): [Seleziona]
                for(Integer pos: daEliminare){
                    listView.setItemChecked(pos, true);
                }

Ma rimane il problema del click sull'item già clikkato.

Grazie dell'aiuto.

Offline elfo83

  • Utente normale
  • ***
  • Post: 287
  • Respect: +23
    • Mostra profilo
  • Sistema operativo:
    Mac OS 10.8.2
Re:RelativeLayout Checkable TextView cambio colore
« Risposta #1 il: 03 Marzo 2013, 03:59:08 CET »
0
Non ti andare ad impelagare con un mare di codice  o soluzioni stravaganti...di solito la più semplice è quella giusta. Per fare quello che dici, innanzitutto devi implementare il tuo onClick() all'interno del metodo getView() dell'adapter che usi per la tua listView. Una soluzione molto semplice ed efficace è quella di settare, ad esempio, un tag =1 alle view che vai a cliccare. In questo modo, all'inizio del tuo metodo onClick() vai a controllare il tag, se è = 1 non fai succedere nulla, altrimenti cambi colore come vuoi. Se hai problemi facci sapere.

Offline Ray13

  • Utente junior
  • **
  • Post: 65
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:RelativeLayout Checkable TextView cambio colore
« Risposta #2 il: 03 Marzo 2013, 14:29:36 CET »
0
Ciao su tuo consiglio sto provando a fare come dici tu ma ho problemi nel realizzarlo.

Ho preso per esempio quest'altro tutorial
[medio] Utilizzo dei Button nelle ListView con layout personalizzato - Android Developers Italia

ma non riesco ad adattarlo al mio. Come faccio ad implementare nel mio Adapter nel getView il mio metodo
Codice (Java): [Seleziona]
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
}

che è contenuto nell'activity principale?

Post unito: 03 Marzo 2013, 14:32:07 CET
In quell'esempio lui aggiunge questo codice nell'adapter:

Codice (Java): [Seleziona]
                Button btShowToast = viewCache.getButtonShowToast();
                // Per praticità metto un riferimento a "Person" nel tag del bottone
                btShowToast.setTag(person);
                btShowToast.setOnClickListener(new OnClickListener() {
                        public void onClick(View view) {
                                Toast.makeText(
                                                view.getContext(),
                                                "Click sul bottone nella riga " + ((Person)view.getTag()).getFullName(),
                                                Toast.LENGTH_SHORT
                                                ).show();
                        }
                });

Ma io non devo aggiungere un bottone ma il metodo onItemClick che è il metodo di un intera listView
« Ultima modifica: 03 Marzo 2013, 14:32:07 CET da Ray13, Reason: Merged DoublePost »

Offline elfo83

  • Utente normale
  • ***
  • Post: 287
  • Respect: +23
    • Mostra profilo
  • Sistema operativo:
    Mac OS 10.8.2
Re:RelativeLayout Checkable TextView cambio colore
« Risposta #3 il: 03 Marzo 2013, 15:26:42 CET »
0
Questa sera ti rispondo, ora sono fuori casa..

Offline Ray13

  • Utente junior
  • **
  • Post: 65
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:RelativeLayout Checkable TextView cambio colore
« Risposta #4 il: 03 Marzo 2013, 15:27:31 CET »
0
Ok grazie ^__^

Post unito: 03 Marzo 2013, 22:06:13 CET
Anche durante le iene ho provato un po' di volte ma proprio non riesco a capire come fargli vedere il click dall'adapter. L'adaptrr non entra in funzione solo alla creazione e non ad ogni click?
« Ultima modifica: 03 Marzo 2013, 22:06:13 CET da Ray13, Reason: Merged DoublePost »

Offline elfo83

  • Utente normale
  • ***
  • Post: 287
  • Respect: +23
    • Mostra profilo
  • Sistema operativo:
    Mac OS 10.8.2
Re:RelativeLayout Checkable TextView cambio colore
« Risposta #5 il: 04 Marzo 2013, 06:28:08 CET »
0
Allora, quando vai ad implementare il tuo adapter, stai scegliendo il modo in cui vuoi mostrare gli elementi nella tua listView. Quando scorri la listView è l'adapter che esegue tutto il lavoro di rappresentazione dei dati. Tutti gli oggetti che rappresenti in una riga, sono inseriti dinamicamente dal metodo getView(...) dell'adapter, ovvero su ogni oggetto della lista viene invocato il metodo getView(..) . Se il tuo obiettivo è quello di cliccare su una riga qualsiasi della lista e cambiare permanentemente il colore della textView che è contenuta nella riga puoi innanzitutto dichiarare Il metodo onItemClick(...) al di fuori dell'adapter (puoi benissimo farlo nell'onCreate()). Ora, nel metodo getView() puoi associare ad ogni textView un tag, ad esempio "1". Questo tag ti serve per capire e gestire il colore della textView. Nel metodo onItemClick() andrai a vedere prima il tag. Se il tag è = 1 significa che quella textView ha ancora il colore originale, ciò significa che quella riga non è stata ancora cliccata. Quindi gli cambi il colore e gli setti il tag a 0.  Se il tag è uguale a 0, vuol dire che quella riga è stata già cliccata e quindi non devi fare nulla. La cosa fondamentale è che il controllo del tag lo fai anche nel metodo getView dell'adapter, perchè sarà proprio lui a farti visualizzare quando scorri la vista il colore giusto. Non so se sono stato molto chiaro, comunque prova a farlo e se hai problemi, domani cerco di postarti la soluzione.

Offline Ray13

  • Utente junior
  • **
  • Post: 65
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:RelativeLayout Checkable TextView cambio colore
« Risposta #6 il: 04 Marzo 2013, 13:21:02 CET »
0
Ora proverò a realizzarlo. Inizialmente avevo capito male. Pensavo che l'onItemClick dovesse essere anche dentro l'adapter. A questo punto mi viene un dubbio però, visto che già avevo realizzato una cosa del genere. Il problema è che in questo modo le mie textView cliccate cambieranno colore solo se esco e rientro. Ovvero se si ricrea la lista e quindi controlla i tag. A me servirebbe che al click cambi colore.

Post unito: 04 Marzo 2013, 14:52:33 CET
Allora attualmente ho inserito nell'adapter:

Codice (Java): [Seleziona]
        holder.txtDesc.setTag("1");
In modo che tutte le mie textViiew hanno tag 1..

Poi nell'onItemClick all'interno di alcuni if ho inserito:

Codice (Java): [Seleziona]
                                                        if(numeroDomanda.getTag() == "1"){
                                            Log.i("RISPOSTA", "tag 1");
                                             numeroDomanda.setTextColor(Color.GREEN);
                                                                numeroDomanda.setTag("2");
                                                        }

Però mi crasha al click e mi da come errore la prima riga se il tag è 1. Forse è la sintassi?

Posto il log:

Codice: [Seleziona]
03-04 13:51:13.717: E/AndroidRuntime(727): java.lang.NullPointerException
03-04 13:51:13.717: E/AndroidRuntime(727):         at ray13.tryquiz.ImageTextListBaseAdapterActivity.onItemClick(ImageTextListBaseAdapterActivity.java:479)
03-04 13:51:13.717: E/AndroidRuntime(727):         at android.widget.AdapterView.performItemClick(AdapterView.java:298)
03-04 13:51:13.717: E/AndroidRuntime(727):         at android.widget.AbsListView.performItemClick(AbsListView.java:1086)
03-04 13:51:13.717: E/AndroidRuntime(727):         at android.widget.AbsListView$PerformClick.run(AbsListView.java:2859)
03-04 13:51:13.717: E/AndroidRuntime(727):         at android.widget.AbsListView$1.run(AbsListView.java:3533)
03-04 13:51:13.717: E/AndroidRuntime(727):         at android.os.Handler.handleCallback(Handler.java:615)
03-04 13:51:13.717: E/AndroidRuntime(727):         at android.os.Handler.dispatchMessage(Handler.java:92)
03-04 13:51:13.717: E/AndroidRuntime(727):         at android.os.Looper.loop(Looper.java:137)
03-04 13:51:13.717: E/AndroidRuntime(727):         at android.app.ActivityThread.main(ActivityThread.java:4745)
03-04 13:51:13.717: E/AndroidRuntime(727):         at java.lang.reflect.Method.invokeNative(Native Method)
03-04 13:51:13.717: E/AndroidRuntime(727):         at java.lang.reflect.Method.invoke(Method.java:511)
03-04 13:51:13.717: E/AndroidRuntime(727):         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
03-04 13:51:13.717: E/AndroidRuntime(727):         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
03-04 13:51:13.717: E/AndroidRuntime(727):         at dalvik.system.NativeStart.main(Native Method)

« Ultima modifica: 04 Marzo 2013, 14:52:33 CET da Ray13, Reason: Merged DoublePost »

Offline elfo83

  • Utente normale
  • ***
  • Post: 287
  • Respect: +23
    • Mostra profilo
  • Sistema operativo:
    Mac OS 10.8.2
Re:RelativeLayout Checkable TextView cambio colore
« Risposta #7 il: 04 Marzo 2013, 16:36:17 CET »
0
La TextView che si chiama numeroDomanda come la prendi? Puoi recuperarla tramite nomeLista.get(position) ad esempio...prova a postare tutto il codice del metodo onItemClick() e getView().

Offline Ray13

  • Utente junior
  • **
  • Post: 65
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:RelativeLayout Checkable TextView cambio colore
« Risposta #8 il: 04 Marzo 2013, 20:25:15 CET »
0
Umh a quanto pare c'è qualcosa che mi manca. In che senso come la prendo? XD

Comunque copio il codice di OnItemClick è un po' confusionario ma c'è altra robba dentro:

Codice (Java): [Seleziona]
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                MyDatabase db =new MyDatabase(getApplicationContext());// gli indico il db
                db.open();  //apriamo il db
             // con questa sotto gli faccio trovare la textview nella posizione specifica
                numeroDomanda = (TextView)findViewById(R.id.question);

                  if(db.fetchProductsConta().getCount()==0){//inserimento dati, solo se il db è vuoto
                             db.insertConta("valerio");//stringa inutile
                  }
                  Cursor c2=db.fetchProductsConta();
                  int contaCol=c2.getColumnIndex(MyDatabase.ProductsMetaData.CONTA_KEY);
                    if(c2.moveToFirst()){  //se va alla prima entry, il cursore non è vuoto
                        do {
                                a.add(c2.getString(contaCol));
                                System.out.println(a+"qui");
                                } while (c2.moveToNext());//iteriamo al prossimo elemento
                }  

                                                if(position == position){
                                           if(a.contains("conta"+position)){
                                                        Intent myIntent = new Intent(this, Question2.class);
                                                        RowItem myCustomBaseAdapter = rowItems.get(position);
                                                        myIntent.putExtra(KEY_ROWITEM, myCustomBaseAdapter);
                                                          startActivity(myIntent);
                                                } else {
                                                        if(numeroDomanda.getTag() == "1"){
                                            Log.i("RISPOSTA", "tag 1");
                                            rowItems.get(position); /* ++++++++++++++++++++++++++++++++++*/
                                            numeroDomanda.setTextColor(Color.GREEN);
                                                                numeroDomanda.setTag("2");
                                                        }
                                              db.insertConta("conta"+position);
                                                        RowItem myCustomBaseAdapter = rowItems.get(position);
                                                        Intent myIntent = new Intent(this, Question.class);
                                                        myIntent.putExtra(KEY_ROWITEM, myCustomBaseAdapter);
                                                          startActivityForResult(myIntent, REQUEST_CODE);
                                                }
                                                        }
       
            }
           

Questo è il mio getView dell'adapter ma c'è qualcosa che non va. la riga con i + penso sia sbagliata perchè mi colora sempre e solo il primo item. Sia se la metto che se non la metto quella riga. . Quindi non riconosce la posizione.
 Credo sia sbagliato qualcosa nel codice.

Copio anche il codice del getView:

Codice (Java): [Seleziona]
    public View getView(int position, View convertView, ViewGroup parent) {

       
        ViewHolder holder = null;
        LayoutInflater mInflater = (LayoutInflater)
            context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.list_item, null);
            holder = new ViewHolder();
            holder.txtDesc = (TextView) convertView.findViewById(R.id.desc);
            holder.txtQuestion = (TextView) convertView.findViewById(R.id.question);
            holder.imageView = (ImageView) convertView.findViewById(R.id.icon);
            convertView.setTag(holder);
        }
        else {
           holder = (ViewHolder) convertView.getTag();

        }

        RowItem rowItem = (RowItem) getItem(position);
        holder.txtDesc.setText(rowItem.getDesc());
        holder.txtQuestion.setText(rowItem.getQuestion());
        holder.imageView.setImageResource(rowItem.getImageId());
        holder.txtQuestion.setTag("1");
       
        return convertView;
    }

Post unito: 05 Marzo 2013, 15:11:30 CET
un up giornaliero se a qualcuno viene in mente qualcosa  :-(

Post unito: 06 Marzo 2013, 14:36:56 CET
up giornaliero ^^ Niente di niente?
« Ultima modifica: 06 Marzo 2013, 14:36:56 CET da Ray13, Reason: Merged DoublePost »