如何正确覆盖SpinnerAdapter的方法

时间:2010-06-18 18:17:52

标签: android

我使用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) {

}

有人知道我必须在每种方法中编码吗?

3 个答案:

答案 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();
}