2013-06-12 14 views
9

ho ricevuto il seguente avviso:Vista personalizzata manca costruttore utilizzato dagli strumenti per l'adattatore

Vista personalizzata com/es/view/adattatore/SomeAdapter manca costruttore usata da strumenti: (Context) o (Context , AttributeSet) o (Context, AttributeSet, int)

nella mia classe SomeAdapter che si estende un po 'BaseAdapter che si estende ArrayAdapter

public class SomeAdapter extends BaseAdapter{} 
public abstract class BaseAdapter extends ArrayAdapter<SomeModel>{} 

L'avviso esiste nell'adattatore concreto ma non nel BaseAdapter astratto. Qualcuno ha mai sentito parlare di questo avvertimento in quel contesto?

per quanto ne so Android controlla le classi perché stanno estendendo vista controllando il nome delle classi Super via ViewConstructorDetector:

private static boolean isViewClass(ClassContext context, ClassNode node) { 
    String superName = node.superName; 
    while (superName != null) { 
     if (superName.equals("android/view/View")    //$NON-NLS-1$ 
       || superName.equals("android/view/ViewGroup") //$NON-NLS-1$ 
       || superName.startsWith("android/widget/")  //$NON-NLS-1$ 
       && !((superName.endsWith("Adapter")    //$NON-NLS-1$ 
         || superName.endsWith("Controller")  //$NON-NLS-1$ 
         || superName.endsWith("Service")   //$NON-NLS-1$ 
         || superName.endsWith("Provider")  //$NON-NLS-1$ 
         || superName.endsWith("Filter")))) {  //$NON-NLS-1$ 
      return true; 
     } 

     superName = context.getDriver().getSuperClass(superName); 
    } 

    return false; 
} 

Per quanto posso vedere i miei nomi di classe non corrispondono al modello di cui sopra. Qualcuno ha qualche idea su come correggere o sopprimere questo avviso?

GetView() in BaseAdapter:

@Override 
public final View getView(final int position, final View convertView, final ViewGroup parent) { 
    View view = convertView; 
    if (null == view) { 
     view = createNewView(parent, position); 
    } else { 
     reuseOldView(view, position); 
    } 
    return view; 
} 
+0

Cosa implementa l'adattatore? Hai una visualizzazione personalizzata? – Neil

+0

No, non implemento nulla. Basta estendere l'ArrayAdapter. – salcosand

+0

per quale scopo? Un adattatore non può funzionare da solo. Per cosa lo vuoi usare? – Neil

risposta

8

Nella classe CustomView aggiungere costruttori:

public CustomView(Context context) { 
    super(context); 
} 
public CustomView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 
+0

Non ho CusonView. Ho solo i miei adattatori. E l'ArrayAdapter non fornisce tali costruttori. – salcosand

+0

Potresti pubblicare il tuo metodo getView() dagli adattatori? Grazie – Jarvis

+0

Non sono sicuro di cosa sia buono, ma ecco qua. GetView() è implementato nel BaseAdapter ma non in SomeAdapter, dove si trova l'avviso. – salcosand

3

Alcuni strumenti di layout (come ad esempio l'editor di layout di Android per Eclipse) ha bisogno di trovare un costruttore con una delle seguenti firme: * View(Context context) * View(Context context, AttributeSet attrs) * View(Context context, AttributeSet attrs, int defStyle)

Se non si utilizza queste cose, e vuole solo sbarazzarsi di questo avvertimento per tutti i vostri progetti Semplicemente vai a:

Finestra -> Preferenze -> Android -> Lint Controllo errori.

Trova ViewConstructor dall'elenco e impostare la gravità di 'ignorare'.

+0

Questo influenza l'editor di layout? Quello che non capisco è perché Lint pensa che il mio adattatore sia una vista. – salcosand