2010-06-18 11 views
16

Im używać SpinnerAdapter do wyświetlania Spinner. W tym celu zdefiniowałem klasę, która implementuje SpinnerAdapter. Niestety nie wiem w jaki sposób, aby zastąpić pewne metody SpinnerAdapter:Jak poprawnie zastąpić metody SpinnerAdaptera

@Override 
public View getDropDownView(int position, View arg1, ViewGroup arg2) { 

} 


@Override 
public int getItemViewType(int arg0) { 

} 

@Override 
public boolean hasStableIds() { 

} 

@Override 
public void registerDataSetObserver(DataSetObserver arg0) { 

} 

@Override 
public void unregisterDataSetObserver(DataSetObserver observer) { 

} 

Czy ktoś wie, co mam do kodu w każdej z tych metod?

Odpowiedz

37

Dzięki za odpowiedzi, ale mimo wszystko chcę się z wami podzielić rozwiązanie użyłem po wyszukaniu kolejne nazwy:

Zamiast że właśnie wdrożenie SpinnerAdapter w moim Adapter, przedłużyć BaseAdapter i wdrożenie SpinnerAdapter:

private class ListAdapter extends BaseAdapter implements SpinnerAdapter { 

     @Override 
     public int getCount() { 
      return allLists.size(); 
     } 

     @Override 
     public Object getItem(int position) { 
      return allLists.get(position); 
     } 

     @Override 
     public long getItemId(int position) { 
      return position; 
     } 

     @Override 
     public View getView(int position, View view, ViewGroup parent) { 
      TextView text = new TextView(lexs); 
      text.setText(allLists.get(position).getName()); 
      return text; 
     } 

    } 

Wtedy nie ma potrzeby, aby zastąpić wszystkie te dziwne metody, takie jak isEmpty(), registerDataObserver() itp

A jeśli necessry można jeszcze zastąpić getDropDownView (...)

Dodatkowo za pomocą tego rozwiązania można wywołać metodę adapter.notifyDatasetChanged(), która nie jest tak łatwa, jeśli adapter implementuje SpinnerAdapter i nie rozszerza BaseAdaptera.

+2

Co to są allLists i gdzie je zdobywasz lub tworzysz? – CACuzcatlan

+0

@CACuzcatlan allLists może być ArrayList , jeśli usuniesz .getName() z getView. –

+0

BaseAdapter już implementuje SpinnerAdapter, więc nie musisz go ponownie wdrażać. http://developer.android.com/reference/android/widget/BaseAdapter.html Proszę rozważyć moją odpowiedź. –

2

Najważniejsza metoda, jeśli getDropDownView(). Spowoduje to utworzenie instancji View w celu wyświetlenia danych o wybranym identyfikatorze. arg1 to widok konwersji, istniejący widok, który może być modyfikowany i zwracany przez funkcję, aby nie trzeba było tworzyć zupełnie nowego widoku za każdym razem, gdy użytkownik wybierze indeks danych. arg2 to nadrzędna grupa ViewGroup, do której należy wstawić utworzony (lub przekonwertowany) widok.

Inne metody są dziedziczone z klasy Adapter, a ich implementacja może być naprawdę zrozumiała tylko w tym kontekście. Ich użycie jest udokumentowane here.

+0

hmm tak, ale nie zwracam się do zrozumienia, jeśli np. Muszę zwrócić wartość true lub false w publicznym boolean hasStableIds() {}. I jaka jest różnica między getDropDownView i getView()? – RoflcoptrException

1

Spójrz na źródła BaseAdapter. Trzeba tylko dodać te linie do niestandardowej implementacji ListAdapter lub SpinnerAdapter.

private final DataSetObservable mDataSetObservable = new DataSetObservable(); 

@Override 
public void registerDataSetObserver(DataSetObserver observer) { 
    mDataSetObservable.registerObserver(observer); 
} 

@Override 
public void unregisterDataSetObserver(DataSetObserver observer) { 
    mDataSetObservable.unregisterObserver(observer); 
} 

/** 
* Notifies the attached observers that the underlying data has been changed 
* and any View reflecting the data set should refresh itself. 
*/ 
public void notifyDataSetChanged() { 
    mDataSetObservable.notifyChanged(); 
} 
Powiązane problemy