【问题标题】:How to correctly overwrite methods of SpinnerAdapter如何正确覆盖 SpinnerAdapter 的方法
【发布时间】:2010-06-18 18:17:52
【问题描述】:

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

}

有人知道我必须在这些方法中编写什么代码吗?

【问题讨论】:

    标签: android


    【解决方案1】:

    感谢您的回答,但我还是想与您分享我在搜索更多参考资料后使用的解决方案:

    我只是在我的适配器中实现 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,这并不容易。

    【讨论】:

    • 什么是 allLists,您从哪里获得或创建它?
    • @CACuzcatlan allLists 可以是 ArrayList 如果您从 getView 中删除 .getName()。
    • BaseAdapter 已经实现了 SpinnerAdapter,所以你不需要再次实现它。 developer.android.com/reference/android/widget/BaseAdapter.html 请考虑我的回答。
    • getView() 显然不能返回TextView,而签名告诉View——应该是convertViewR.layout.support_simple_spinner_dropdown_item 是一种默认布局,可用于项目。
    【解决方案2】:

    最重要的方法是getDropDownView()。这将创建一个 View 实例来显示所选 ID 处的数据。 arg1是convert View,一个已有的View,可以通过函数修改和返回,这样就不需要用户每次选择数据索引时都创建一个全新的View。 arg2 是应放置创建(或转换)视图的父 ViewGroup。

    其他的方法都是继承自Adapter类的,只有在那个上下文中才能真正理解它们的实现。他们的用法记录在here

    【讨论】:

    • 嗯,是的,但我不明白,例如我必须在公共布尔 hasStableIds() {} 中返回真或假。 getDropDownView 和 getView() 有什么区别?
    【解决方案3】:

    查看 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();
    }
    

    【讨论】:

      猜你喜欢
      • 2015-09-16
      • 1970-01-01
      • 2016-03-07
      • 2011-01-20
      • 1970-01-01
      • 2016-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多