我使用SpinnerAdapter来显示Spinner。为此,我定义了一个实现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) {
}
有人知道我必须在每种方法中编码吗?
答案 0 :(得分:39)
感谢您的回答,但我想与您分享我在搜索更多参考资料后使用的解决方案:
相反,只需在我的适配器中实现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()等。
如果有必要,仍然可以覆盖getDropDownView(...)
另外使用这个解决方案,可以调用adapter.notifyDatasetChanged(),如果适配器只实现SpinnerAdapter并且不扩展BaseAdapter,那就不那么容易了。
答案 1 :(得分:2)
getDropDownView()最重要的方法。这将创建一个View实例,以显示所选ID的数据。 arg1是转换视图,它是一个现有的视图,可以由函数修改和返回,以便每次用户选择数据索引时都不需要创建一个全新的视图。 arg2是应放置创建(或转换)视图的父ViewGroup。
其他方法继承自Adapter类,它们的实现只能在该上下文中真正理解。它们的用法记录在here。
答案 2 :(得分: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();
}