2013-12-12 6 views
5

Android GridView è piuttosto interessante, riutilizza le visualizzazioni secondarie. Quelli che scorrono verso l'alto ritorna dal basso. Quindi non esiste alcun metodo da GridView per ottenere la vista figlio dalla sua posizione. Ma ho davvero bisogno di vedere la sua posizione e di lavorarci sopra. Quindi, per fare ciò, ho creato un SparseArray e ho inserito le visualizzazioni in base alla loro posizione in esso da getView di BaseAdapter.GridView visualizza per posizione, prima vista figlio diversa

SparseArray<View> ViewArray = new SparseArray<View>(); 

public View getView(int position, View convertView, ViewGroup parent) { 
    View view = convertView;  
    if (view == null) 
     view = li.inflate(layoutID, null); 
    ViewArray.put(position, view); 
} 

Ora, posso ottenere tutte le viste visibili dalla loro posizione. Tutto funziona perfettamente come dovrebbe, ma in alcuni dispositivi, la prima vista figlio (posizione 0) non è la stessa di quella dell'array. Ho registrato il getView e ho trovato che per la posizione 0, getView è stato chiamato più volte e ogni volta l'array è stato impostato con una vista diversa. Non ho idea del perché GridView stia chiamando getView per la posizione 0 molte volte e ciò accade solo su pochi dispositivi. Qualche soluzione?

risposta

5

Dopo aver letto fonte di getPositionForView, ho scritto esimo è il metodo in proprio GridView, funziona perfettamente con API 18

public View GetViewByPosition(int position) { 
    int firstPosition = this.getFirstVisiblePosition(); 
    int lastPosition = this.getLastVisiblePosition(); 

    if ((position < firstPosition) || (position > lastPosition)) 
     return null; 

    return this.getChildAt(position - firstPosition); 
} 
1

Non è possibile raggiungere le viste direttamente a causa del riciclaggio. La vista in posizione 0 può essere riutilizzata per la posizione 10, quindi non è possibile essere certi dei dati presenti in una vista specifica.

La strada da percorrere è utilizzare i dati sottostanti. Se è necessario modificare i dati nella posizione 10, esegui l'elenco o l'array sotto l'adattatore e chiama notifyDataSetChanged() sull'adattatore.

se avete bisogno di avere punti di vista diversi per i diversi sottotipi di dati, è possibile ignorare i due seguente metodo nella scheda: getItemViewType() e getViewTypeCount()

Poi, nel getView() è possibile 1) decidere quale layout per gonfiare 2) sapere il tipo di vista riciclata con getItemViewType()

È possibile trovare un esempio qui: https://stackoverflow.com/a/5301093/990616

0

C'è stato un problema segnalato per questo. Ecco lo link. Questo problema è stato chiuso come WorkingAsIntended. Desiderio significa che possiamo aspettarci che GridView chiami getView() su pos 0 più volte.

mio lavoro intorno è la seguente:

public class GridAdapter extends BaseAdapter { 
    ... 
    int previouslyDisplayedPosition = -1; 
    ... 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
    if(previouslyDisplayedPosition != position) { 
     .... 

     previouslyDisplayedPosition = position; 
    } 

    return convertedView; 
    } 

Quello che sto cercando di fare qui sta tornando la stessa 'convertView' se stesso pos si chiama ancora e ancora. Lì prevenendo qualsiasi logica entro getView() (ad es. Impostando la visualizzazione dell'immagine, ecc.) Da eseguire ancora e ancora.

Problemi correlati