2010-07-08 37 views
8

Ho un ListView con un adattatore di lista personalizzato. Nel metodo getView(), sto usando il 'pattern' di ViewHolder come mostrato nelle demo di API per ListView14.java. Quando eseguo il rendering della lista, sembra che si carichi correttamente. Tuttavia, il problema che sto incontrando è che quando faccio scorrere l'elenco, sto vedendo i dati per l'elenco appaiono nelle righe sbagliate (cioè un TextView che dovrebbe essere nella riga 10 viene visualizzato nella riga 2 per esempio). Tuttavia, quando non utilizzo l'viewholder e richiama findViewById() ogni volta, la vista elenco viene visualizzata correttamente.viewview android viewview. quando usarlo, e quando non su

risposta

10

Tuttavia, il problema che sto funzionando in è che quando ho scorrere la lista, io sono vedere i dati per la lista presentarsi nelle righe sbagliate (vale a dire un TextView che dovrebbe essere in la riga 10 mostra nella riga 2, ad esempio).

Molto probabilmente, si sta impropriamente Riciclaggio filari, in modo tale che il ViewHolders si stanno manipolando non sono quelle giuste per la riga si restituisce.

Here is a free excerpt da uno dei miei libri che riguarda più il riciclaggio delle righe, forse ti aiuterà a identificare dove le cose stanno andando male.

+2

è davvero un grande tutorial, grazie. – eric2323223

1

quindi penso di aver scoperto il vero problema qui. quando imposti i parametri di layout al volo per ogni riga, devi assicurarti di farlo per tutte le condizioni. il mio problema era che se era la prima riga, ho impostato un parametro di layout (come padding o margini ecc.), ma se era una riga centrale, non ho impostato esplicitamente quei parametri pensando che avrebbe usato solo quello che era gonfiato dalla vista inflater. Questo spiega perché ha funzionato quando ho gonfiato la vista ogni volta. Ecco una prima & dopo:

PRIMA:

if (position == 0) { 

      layoutParams.topMargin = uiHelper.getDip(15.0f); 
      layoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP, 
        RelativeLayout.TRUE); 
      holder.actionMenu.setLayoutParams(layoutParams); 

      holder.contentLayout.setBackgroundResource(R.drawable.top_row); 

     } else if (position == posts.size() - 1) { 
      holder.contentLayout 
        .setBackgroundResource(R.drawable.bottom_row); 

      holder.contentLayout.setPadding(holder.contentLayout 
        .getPaddingLeft(), 
        holder.contentLayout.getPaddingTop(), 
        holder.contentLayout.getPaddingRight(), 
        holder.contentLayout.getPaddingBottom() + uiHelper.getDip(10.0f)); 

     } else { 
      holder.contentLayout 
        .setBackgroundResource(R.drawable.inner_row); 
     } 

DOPO: `

  layoutParams.topMargin = uiHelper.getDip(10.0f); 
     holder.contentLayout.setPadding(holder.contentLayout 
       .getPaddingLeft(), 
       holder.contentLayout.getPaddingTop(), 
       holder.contentLayout.getPaddingRight(), 
       uiHelper.getDip(10.0f)); 
     if (position == 0) { 

      layoutParams.topMargin = uiHelper.getDip(15.0f); 
      layoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP, 
        RelativeLayout.TRUE); 

      holder.contentLayout.setBackgroundResource(R.drawable.top_row); 

     } else if (position == posts.size() - 1) { 
      holder.contentLayout 
        .setBackgroundResource(R.drawable.bottom_row); 

      holder.contentLayout.setPadding(holder.contentLayout 
        .getPaddingLeft(), 
        holder.contentLayout.getPaddingTop(), 
        holder.contentLayout.getPaddingRight(), 
        uiHelper.getDip(20.0f)); 

     } else { 

      holder.contentLayout 
        .setBackgroundResource(R.drawable.inner_row); 

     } 

     holder.actionMenu.setLayoutParams(layoutParams); 
2
  • Ho affrontato lo stesso problema
  • risolvere dopo aver seguito techninc
  • Motivo: non Adapter Caricato frequentemente.
  • nella classe adattatore aggiuntivi personalizzati ViewHolder utilizzando specificatori di accesso

    private static class ViewHolder { 
    
         protected TextView itemName; 
    
        } 
    

In Get View metodo

@Override 

     public View getView(int position, View view, ViewGroup viewGroup) { 

      // create a ViewHolder reference 
      ViewHolder holder; 

      //check to see if the reused view is null or not, if is not null then reuse it 
      if (view == null) { 
       holder = new ViewHolder(); 

       view = mLayoutInflater.inflate(R.layout.list_item, null); 
       holder.itemName = (TextView) view.findViewById(R.id.list_item_text_view); 

       // the setTag is used to store the data within this view 
       view.setTag(holder); 
      } else { 
       // the getTag returns the viewHolder object set as a tag to the view 
       holder = (ViewHolder)view.getTag(); 
      } 
    // now Use Holder object toget Idss 

    holder.itemName.setText(" sample text based on position "); 
    } 

Importante: e non dovremmo impostare qualsiasi tag per la vista oggetto ad eccezione dell'oggetto Viewholder

+0

Grazie mille per questo utile snip del codice. – swiftBoy

Problemi correlati