2010-06-18 107 views
16

Im使用SpinnerAdapter來顯示一個Spinner。爲此,我定義了一個實現SpinnerAdapter的類。不幸的是,我不知道如何重寫SpinnerAdapter的一些方法:如何正確覆蓋SpinnerAdapter的方法

@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) { 

} 

有誰知道我有什麼代碼每一種方法?

回答

37

感謝您的答案,但無論如何,我想與大家分享我尋找更多的參考資料之後使用的解決方案:

而不是隻是在我的適配器實現SpinnerAdapter,我謹向BaseAdapter和實施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; 
     } 

    } 

然後,它是沒有必要覆蓋所有這種奇怪的方法,如的isEmpty(),registerDataObserver()等

如果necessry人們仍然可以覆蓋getDropDownView(...)

此外,使用此解決方案,可以調用adapter.notifyDatasetChanged(),如果適配器只實現SpinnerAdapter並且不擴展BaseAdapter,那麼這不是那麼容易。

+2

什麼是allLists,你在哪裏得到它或創建它? – CACuzcatlan 2011-10-19 22:53:37

+0

@CACuzcatlan allLists可以是一個ArrayList 如果您從getView中刪除.getName()。 – 2012-05-06 04:13:16

+0

BaseAdapter已經實現了SpinnerAdapter,所以你不需要再次實現它。 http://developer.android.com/reference/android/widget/BaseAdapter.html 請考慮我的答案。 – 2013-01-19 09:43:34

2

getDropDownView()最重要的方法。這會創建一個View實例來顯示所選ID上的數據。 arg1是convert View,一個現有的View,可以被該函數修改並返回,以便每次用戶選擇一個數據索引時不需要創建一個全新的View。 arg2是創建(或轉換的)視圖應放置在其中的父ViewGroup。

其他方法是從Adapter類繼承而來的,它們的實現只能在該上下文中真正理解。他們的使用記錄在here

+0

hmm是的,但我不rellay明白,如,例如。我必須在public boolean hasStableIds(){}中返回true或false。 getDropDownView和getView()之間的區別是什麼? – RoflcoptrException 2010-06-18 19:20:16

1

看看BaseAdapter的來源。您只需將這些行添加到您的自定義ListAdapter或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(); 
}