Autore Topic: ArrayAdapter e listView: modificare una singola item  (Letto 798 volte)

Offline dvdciri

  • Nuovo arrivato
  • *
  • Post: 2
  • Respect: 0
    • Mostra profilo
ArrayAdapter e listView: modificare una singola item
« il: 24 Dicembre 2013, 01:40:06 CET »
0
Ciao ragazzi, ho un problema con un arrayaAdapter che gestisce una listView.. Ho avuto la necessità di editare singolarmente alcuni item della lista (es posizione 0), sono riuscito a farlo cosi:

Codice: [Seleziona]
ArrayAdapter<String> adapter=new ArrayAdapter<String>(this,R.layout.lista_items_drawer_menu, myStringArrayListitem){
                @Override
                public View getView(int position, View convertView,ViewGroup parent) {
                       
                        TextView textView = (TextView) super.getView(position, convertView, parent);
                   
                        if (position == 0){
                            textView.setTypeface(null, Typeface.BOLD);
                        }
                       
                       
                    return textView;
                }
            };

e funziona, ma al momento dello scroll della lista, l'effetto che avevo dato all'item della posizione 0 viene dato anche ad altri items. Questo perchè la listView non mostra tutti i suoi items nella view ma mostra solo quelli che ti deve far vedere e ricarica la lista ogni volta. In parole più semplici la posizione 0 ad esempio, all'inizio è la prima della lista, una volta scrollata, magari la posizione che prima era 3 diventa la 0 e quindi ricaricando la lista gli viene dato lo stesso effetto.
Vorrei che mi aiutaste a risolvere il problema, grazie in anticipo!

Offline Sakazaki

  • Utente normale
  • ***
  • Post: 396
  • Respect: +74
    • Mostra profilo
  • Dispositivo Android:
    Sony xperia Z
  • Play Store ID:
    Saka Labs
  • Sistema operativo:
    Windows 8
Re:ArrayAdapter e listView: modificare una singola item
« Risposta #1 il: 24 Dicembre 2013, 09:04:58 CET »
0
In parole più semplici la posizione 0 ad esempio, all'inizio è la prima della lista, una volta scrollata, magari la posizione che prima era 3 diventa la 0 e quindi ricaricando la lista gli viene dato lo stesso effetto.

Ma anche no... il javadoc del getView parla chiaro:

Codice: [Seleziona]
position        The position of the item within the adapter's data set of the item whose view we want.
Quindi è la posizione dell'item dentro la lista gestita dall'adapter, non dell'item mostrato.

Piuttosto cambierei il codice così:

Codice (Java): [Seleziona]
  if (position == 0){
    textView.setTypeface(null, Typeface.BOLD);
  }
  else {
    // codice per ripristinare il setTypeface a quello che dovrebbe avere normalmente (non me lo ricordo a memoria)
  }

Perché il problema che stai avendo è che il sistema sta riutilizzando la view per ottimizzare il numero di oggetti da tenere in memoria. Quando riutilizza la view che aveva creato per position=0, e nella quale hai cambiato il Typeface della textView, non essendoci istruzioni contrarie mantiene l'impostazione; in altre parole non ti sta mettendo il blod perché entra nell'if, ma perché quando riutilizza la view creata all'inizio la textview è bold, non essendoci indicazioni diverse la mantiene tale.

Offline dvdciri

  • Nuovo arrivato
  • *
  • Post: 2
  • Respect: 0
    • Mostra profilo
Re:ArrayAdapter e listView: modificare una singola item
« Risposta #2 il: 24 Dicembre 2013, 16:13:44 CET »
0
Ok grazie mille, risolto =)

Offline psycomirko

  • Nuovo arrivato
  • *
  • Post: 2
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    galaxy s5
  • Sistema operativo:
    lolipop
Re:ArrayAdapter e listView: modificare una singola item
« Risposta #3 il: 06 Maggio 2015, 15:32:26 CEST »
0
Anche io ho lo stesso problema devo modificare la view solo del primo elemento della lista:
public View getViewOptimize(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder = null;
        AmountMonth amonth = getItem(position);

        Log.i("getViewOptimize", "position=" + position);
        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            if (position==0){
                // Inflate the layout with image
                convertView = inflater.inflate(R.layout.row_actual_month, parent, false);
            }else {
                convertView = inflater.inflate(R.layout.row_month, parent, false);
            }

            viewHolder = new ViewHolder();
            viewHolder.name = (TextView)convertView.findViewById(R.id.text_view_name);
            viewHolder.total = (TextView)convertView.findViewById(R.id.text_view_total);
            viewHolder.date = (TextView)convertView.findViewById(R.id.text_view_date);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        viewHolder.name.setText(amonth.getName());
        viewHolder.date.setText(amonth.getDate());
        viewHolder.total.setText(amonth.getTotal() + " " +currency);
        return convertView;
    }

ma cosi facendo ogni volta che scrollo mi modiifca anche i valori successi aiutoooo.
Grazie mille per l 'aiuto