Autore Topic: ListView effetto memoria  (Letto 472 volte)

Offline tonno16

  • Utente storico
  • *****
  • Post: 1228
  • Respect: +59
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
ListView effetto memoria
« il: 11 Dicembre 2014, 12:35:14 CET »
0
Ok sinceramente non so che titolo mettere. Ho sempre creato listview fuzionanti. Oggi mi trovo in una situazione strana. Nello schermo ci stanno massimo 4 righe della lista, per un totale di 12 ( ho fatto un esempio)

con un longitemclick setto la view di quella riga con alpha 0.5f. (Ho settato la prima riga)
Facendo lo scroolling noto che automaticamente anche le righe multiple sono cambiate. Per la precisione la quinta riga (come se ci fosse un altro schermo dalla quinta alla ottava e la quinta sarebbe di nuovo la prima riga)

Riscontro tale problema anche in una greedView.
Uso il solito viewHolder nel metodo getView() dell' adapter, verifico se la view è nulla, setto il tag etc.

Devo settare qualche cache nella listView??

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:ListView effetto memoria
« Risposta #1 il: 11 Dicembre 2014, 12:57:17 CET »
0
Perchè la listview ricicla le view così da usarne un numero appena superiore a quelle visibile nello schermo.

La soluzione è implementare un custom adapter completo, dove imposti esplicitamente alpha della riga a 0.5f per la riga prescelta e a 1.0f per le altre. Esplicitamente ogni volta, perchè non si può fare affidamento sul fatto che una volta data una caratteristica, poi viene memorizzata.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline tonno16

  • Utente storico
  • *****
  • Post: 1228
  • Respect: +59
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:ListView effetto memoria
« Risposta #2 il: 11 Dicembre 2014, 14:02:27 CET »
0
Non credo di poter farlo.
Mi spiego. Devo dare la possibilità di selezionare x righe, mediante onItemLongClickListener() sulla listView.

quindi nella mia activity ho:
Codice (Java): [Seleziona]
@Override
    public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l) {
        view.setBackgroundColor(getResources().getColor(android.R.color.holo_red_dark));
        //anche setAlpha volendo
        return true;
    }


Tu indenti una cosa del tipo:
Codice (Java): [Seleziona]
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        File file = getItem(position);
        ViewHolder holder = null;
        int type = getItemViewType(position);

        if (convertView == null) {
            convertView = inflater.inflate(resource, parent, false);
            holder = new ViewHolder();
            holder.imgRowIcon = (ImageView) convertView.findViewById(R.id.imgRowIcon);
            holder.tvRowName = (AutoResizeTextView) convertView.findViewById(R.id.tvRowName);

            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        holder.tvRowName.setText(file.getName());
        holder.imgRowIcon.setImageResource(getResId(file.getExtensionImage()));
        if(file.isHidden()){
            holder.imgRowIcon.setAlpha(0.4f);
        }
       
        convertView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View view) {
                // setto il background o alhpa?
                return true;
            }
        });
        return convertView;
    }

Vi ringrazio

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:ListView effetto memoria
« Risposta #3 il: 11 Dicembre 2014, 14:19:02 CET »
0
Non credo di poter farlo.
Mi spiego. Devo dare la possibilità di selezionare x righe, mediante onItemLongClickListener() sulla listView.

In generale puoi fare tutto quello che ti viene in mente: per gestire la "selezione" puoi creare una struttura dati parallela a quella che contiene il tuo array, o addirittura mettere il flag di selezione nella struttura dati collegata alla ListView tramite adapter. Al longClick vai ad aggiornare il flag "selezionato" della struttura dati e notifichi all'adapter la modifica del dataset. Sarà poi l'adapter a ridisegnare la ListView, facendo in modo che la view selezionata abbia la trasparenza.

Nel modo in cui pensavi di poterlo fare (che avrebbe funzionato se la ListView non riciclasse le View), di fatto avresti memorizzato lo stato "selezionato" nella ListView, in particolare nell'array di tutte le View. Questo solo per dimostrare che da qualche parte deve esserci un array di flag che ricordano i "selezionati".
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline tonno16

  • Utente storico
  • *****
  • Post: 1228
  • Respect: +59
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:ListView effetto memoria
« Risposta #4 il: 11 Dicembre 2014, 14:24:27 CET »
0
Per quanto riguarda il discorso del flag comprendo appieno. Già era implementato.
Ma sono proprio questi dettagli su cosa faccia la listview quando viene scrollata a darmi il nervoso.

Lasciando stare il discorso di prima. Noti che nell' adapter ho un if(file.isHIdden){ setAlhpa() }
Gia questo mi lascia dubbioso. Poichè scrollando su e giu, Vengono settati degli alpha a view che non andrebbero toccate. E non riesco a capitarmi di ciò. Non s dove mette le mani per risolvere la situazione.
L'unica che ho trovato e togliere l'holder, togliere il setTag e inizializzare tutto ogni volta che la listView si scrolla. Corrispondere a eliminare il confronto if(view==null) -> allora inizializzo else setto e basta


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:ListView effetto memoria
« Risposta #5 il: 12 Dicembre 2014, 11:19:56 CET »
0
Poiché le View sono riciclate, se metto un Alpha a una View, lo conserverà per sempre anche dopo il riciclo.

La soluzione è banalissima, ti basta gestire il caso ELSE dove togli la trasparenza. Ti basta un rigo di codice.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline tonno16

  • Utente storico
  • *****
  • Post: 1228
  • Respect: +59
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:ListView effetto memoria
« Risposta #6 il: 12 Dicembre 2014, 15:12:36 CET »
0
Che demente che sono ;)
Else view.setAlpha(1.0f)