9

Mam następujące ostrzeżenie:Niestandardowy widok brakuje konstruktora używany przez narzędzia do adaptera

widok klienta com/example/view/adapter/SomeAdapter brakuje konstruktora używany przez narzędzia: (kontekstu) lub (Context , AttributeSet) lub (Context, AttributeSet, int)

w mojej klasie SomeAdapter która rozciąga się trochę BaseAdapter która rozciąga ArrayAdapter

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

Ostrzeżenie występuje w betonie, ale nie w abstrakcyjnym BaseAdapter. Czy ktoś kiedykolwiek słyszał o tym ostrzeżeniu w tym kontekście?

AFAIK Android sprawdza zajęcia dla ich widoki rozciągające się od sprawdzenia nazwą Super klas poprzez 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; 
} 

O ile widzę moje nazwy klasy nie pasuje do wzorca wyżej. Czy ktoś ma pomysł, jak naprawić lub wyłączyć to ostrzeżenie?

getView() w 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

Co implementuje twój adapter? Czy masz niestandardowy widok? – Neil

+0

Nie, nic nie implementuję. Właśnie rozszerzam ArrayAdapter. – salcosand

+0

w jakim celu? Adapter nie może działać samodzielnie. Do czego chcesz go użyć? – Neil

Odpowiedz

8

W swojej klasie CustomView CustomView dodać konstruktorów:

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

Nie mam żadnego CusonView. Mam tylko moje Adaptery. ArrayAdapter nie zapewnia takich konstruktorów. – salcosand

+0

Czy możesz umieścić swoją metodę getView() z adapterów? Dzięki – Jarvis

+0

Nie jestem pewien, na co to jest dobre, ale proszę bardzo. Metoda getView() jest zaimplementowana w BaseAdapter, ale nie w SomeAdapter, gdzie znajduje się ostrzeżenie. – salcosand

3

Niektóre narzędzia układu (takie jak Android edytorze układ dla Eclipse) musi znaleźć konstruktora z jeden z następujących podpisów: * View(Context context) * View(Context context, AttributeSet attrs) * View(Context context, AttributeSet attrs, int defStyle)

Jeśli nie używasz takich rzeczy, i po prostu chcą pozbyć się tego ostrzeżenia dla wszystkich projektów po prostu udać się do:

Window -> Preferencje -> Android -> Lint Sprawdzanie błędów.

Znajdź ViewConstructor z listy i ustaw nasilenie się 'ignoruj'.

+0

Czy ma to wpływ na edytor układu? Czego nie rozumiem, to dlaczego Lint sądzi, że mój adapter jest widokiem. – salcosand

Powiązane problemy