Autore Topic: Problema con ListView  (Letto 895 volte)

Offline Mr.Donut

  • Utente junior
  • **
  • Post: 67
  • Respect: +4
    • Mostra profilo
  • Dispositivo Android:
    Nexus One, Lg Optimus Chat
  • Sistema operativo:
    Ubuntu 11.04
Problema con ListView
« il: 08 Maggio 2012, 22:58:32 CEST »
0
E' possibile fare in modo che ogni elemento di una listview abbia il testo in bold e una volta che e' stato cliccato non lo sia piu'?
Mi sembra una cosa semplice da fare, ma e' tutto il giorno che sclero sopra...
E mentre ci sono ho un altro problema. Quando scorro la mia listview che ha come background il colore bianco, viene tutto evidenziato di nero e non si vedono piu' gli elementi fin quando smetto di muoverla. E' possibile risolvere questo inconveniente?

Grazie

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:Problema con ListView
« Risposta #1 il: 09 Maggio 2012, 07:59:53 CEST »
0
E' possibile fare in modo che ogni elemento di una listview abbia il testo in bold e una volta che e' stato cliccato non lo sia piu'?
Mi sembra una cosa semplice da fare, ma e' tutto il giorno che sclero sopra...

Se hai usato un adapter di quelli standard non puoi farlo. Devi crearti il tuo adapter personalizzato, con il quale differenziare le caratteristiche della view (esempio il bold ma in generale qualsiasi cosa) a seconda della base dati. Non è una cosa da 2 righe di codice, ci sono tutorial (anche su questo forum) dedicati.

Citazione
E mentre ci sono ho un altro problema. Quando scorro la mia listview che ha come background il colore bianco, viene tutto evidenziato di nero e non si vedono piu' gli elementi fin quando smetto di muoverla. E' possibile risolvere questo inconveniente?

La risposta breve è : metti nella dichiarazione della ListView questo android:cacheColorHint="#00000000"

La risposta lunga (da leggere almeno una volta) è questa : ListView Backgrounds: An Optimization | Android Developers
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline Mr.Donut

  • Utente junior
  • **
  • Post: 67
  • Respect: +4
    • Mostra profilo
  • Dispositivo Android:
    Nexus One, Lg Optimus Chat
  • Sistema operativo:
    Ubuntu 11.04
Re:Problema con ListView
« Risposta #2 il: 09 Maggio 2012, 16:09:51 CEST »
0
Grazie per la risposta! Per quando riguarda l'uso del cache color hint, l'ho trovato 5 minuti dopo aver postato e per questo vi chiedo scusa :P e grazie comunque per la conferma.

Ho usato un custom adapter come ho visto fare su un libro del 2010 ) :/ .
Ne posto una parte e ti chiedo come possa modificarlo per raggiungere il mio scopo.

Codice (Java): [Seleziona]
public class MyObjectArrayAdapter extends ArrayAdapter<String> {
        private final Context context;
        private final String[] values;

        public MyObjectArrayAdapter(Context context, String[] values) {
                super(context, R.layout.obj_item, values);
                this.context = context;
                this.values = values;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
                LayoutInflater inflater = (LayoutInflater) context
                                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);    
                if(convertView == null){
                        convertView = inflater.inflate(R.layout.obj_item, parent, false);
                }
                TextView textView = (TextView) convertView.findViewById(R.id.objName);
                textView.setText(values[position]);
                return convertView;
        }
}

Quello che mi pare di aver capito e' che si debba mettere un "if" e richiamare questa parte

Codice (Java): [Seleziona]
TextView textView = (TextView) convertView.findViewById(R.id.objName);
con un diverso "objName" che verra' messo bold oppure no a seconda di quello che mi serve.
Il mio ArrayAdapter estende un ArrayAdapter<String>, pero' io ho un oggetto che ha piu' elementi e non solo una Stringa al suo interno, allora ogni volta le estraggo e le passo come array al mio array adapter in questo modo (nella mia activity).

Codice (Java): [Seleziona]
MyObjectArrayAdapter adapter = new MyObjectArrayAdapter(this, values);
setListAdapter(adapter);

Avrei inserito nel mio oggetto anche una variabile booleana apposta per fare in modo di poter effettuare la scelta con l'if e mettere il mio "row_item" bold oppure no.
Il problema pero' e' che io non ho idea di come si possa accedere a quella variabile booleana!
C'e' forse un modo per estendere il mio custom array adapter a qualcosa come "ArrayAdapter<Object>"??
Se si riusciresti a indicarmi una qualche guida?

Grazie =)

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:Problema con ListView
« Risposta #3 il: 09 Maggio 2012, 16:49:25 CEST »
0
Ok, siamo molto vicini, la variabile booleana nel tuo oggetto come hai giustamente intuito è la chiave di tutto.

Io in un caso molto simile al tuo, ho esteso l'ArrayAdapter non per una String, ma per il mio oggetto, contenente tutti i dati (deve essere inclusa anche la variabile booleana che serve nel tuo caso). A quel punto ci accedi esattamente come ora accedi al vettore di String e a seconda del valore di tale variabile cambi le proprietà del testo nella TextView.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline Mr.Donut

  • Utente junior
  • **
  • Post: 67
  • Respect: +4
    • Mostra profilo
  • Dispositivo Android:
    Nexus One, Lg Optimus Chat
  • Sistema operativo:
    Ubuntu 11.04
Re:Problema con ListView
« Risposta #4 il: 09 Maggio 2012, 16:54:56 CEST »
0
Ok, siamo molto vicini, la variabile booleana nel tuo oggetto come hai giustamente intuito è la chiave di tutto.

Io in un caso molto simile al tuo, ho esteso l'ArrayAdapter non per una String, ma per il mio oggetto, contenente tutti i dati (deve essere inclusa anche la variabile booleana che serve nel tuo caso). A quel punto ci accedi esattamente come ora accedi al vettore di String e a seconda del valore di tale variabile cambi le proprietà del testo nella TextView.

Come sempre chiacchierare con qualcuno di un mio problema mi e' sempre stato di grande aiuto. Sto provando a estendere il mio custom arr adapter con l'ArrayAdapter<Object> e vedere che cosa cambi direttamente. A breve ti forniro' un aggiornamento.

Grazie

Offline Mr.Donut

  • Utente junior
  • **
  • Post: 67
  • Respect: +4
    • Mostra profilo
  • Dispositivo Android:
    Nexus One, Lg Optimus Chat
  • Sistema operativo:
    Ubuntu 11.04
Re:Problema con ListView
« Risposta #5 il: 09 Maggio 2012, 21:32:53 CEST »
0
Codice (Java): [Seleziona]
public class ObjAdapter extends ArrayAdapter<MyObject>{

    Context context;
    int layoutResourceId;  
    ArrayList<MyObject> data = null;
   
    public ObjAdapter(Context context, int layoutResourceId, ArrayList<MyObject> data) {
        super(context, layoutResourceId, data);
        this.layoutResourceId = layoutResourceId;
        this.context = context;
        this.data = data;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View row = convertView;
        MyObjectHolder holder = null;
       
        if(row == null){
            LayoutInflater inflater = (Activity) context.getLayoutInflater();
            row = inflater.inflate(layoutResourceId, parent, false);
           
            holder = new MyObjectHolder();
            holder.qName = (TextView)row.findViewById(R.id.myobjName);
           
            row.setTag(holder);
        }
        else {
            holder = (MyObjectHolder)row.getTag();
        }
       
        MyObject q = data.get(position);
        holder.qName.setText(q.getMyObject_value());
        if(q.isAnswered()){
                holder.qName.setTypeface(null, 0);
        }
       
        return row;
    }
   
    static class MyObjectHolder
    {
        TextView qName;
    }
}

Ho dovuto modificarlo completamente e credo di essere vicino alla soluzione. Tutti i miei oggetti hanno la variabile settata a false e quindi inizialmente li carico come BOLD. Quando li visito setto la variabile a true e quindi successivamente riaprendo la listview dovrei vederne alcuni non bold e altri bold.

Purtroppo non riesco a farla funzionare e non capisco il motivo. Uno degli errori e' il seguente:
Codice (Java): [Seleziona]
           
LayoutInflater inflater = (Activity) context.getLayoutInflater();
 

Codice (Java): [Seleziona]
Multiple markers at this line
        - The method getLayoutInflater() is undefined for the type
         Context
        - Activity cannot be resolved to a type
        - Activity cannot be resolved to a type

Avresti qualche idea? =)

« Ultima modifica: 09 Maggio 2012, 21:34:33 CEST da Mr.Donut »

Offline Mr.Donut

  • Utente junior
  • **
  • Post: 67
  • Respect: +4
    • Mostra profilo
  • Dispositivo Android:
    Nexus One, Lg Optimus Chat
  • Sistema operativo:
    Ubuntu 11.04
Re:Problema con ListView
« Risposta #6 il: 11 Maggio 2012, 21:14:35 CEST »
0
Ok ho risolto e posto la soluzione, perche' potrebbe servire a qualcuno:


The Adapter
Codice (Java): [Seleziona]
public class MyAdapter extends ArrayAdapter<MyObject> {
        private final Context context;
        private final ArrayList<MyObject> values;

        public MyAdapter(Context context, ArrayList<MyObject> values) {
                super(context, R.layout.my_item, values);
                this.context = context;
                this.values = values;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
                LayoutInflater inflater = (LayoutInflater) context
                                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);    
                if(convertView == null){
                        convertView = inflater.inflate(R.layout.my_item, parent, false);
                }
                TextView textView = (TextView) convertView.findViewById(R.id.itemName);
                textView.setText(values.get(position).getItem_value());
               
                if(values.get(position).isAns()){
                        textView.setTypeface(null);
                } else {
                        textView.setTypeface(null, Typeface.BOLD);
                }
               
                return convertView;
        }
}

E nella mia activity gestisco la pressione in questo modo:

Codice (Java): [Seleziona]
        @Override
        protected void onListItemClick(ListView l, View v, int position, long id) {
                super.onListItemClick(l, v, position, id);
               
                String item = itemList.get(position).getItem_value();
                itemList.get(position).setAns(true);
               
                        to_answers.putExtra("itemName", item);
                        startActivity(to_ans);

        }

Spero che possa servire a qualcuno!