YSpinner

起因

工作中的一個需求,實現點擊顯示下拉列表,并且默認顯示列表中的某個item,在github上找了一圈,找到一個“NiceSpinner”,樣式合適,但是拓展性不夠,于是有了本篇博客。

需求確定

spinner默認狀態(tài)顯示已選中的item內容,點擊展開列表中不顯示當前內容,即:{“one”,"two","three"},其中默認為“one”的話,列表只顯示“two”,“three” 。

效果圖如下

performance.gif

在xml中配置

<com.yspinner.widget.YSpinner
            android:id="@+id/spinner"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textColor="@color/spinner_text_color" />

YSpinnerBaseAdapter


public abstract class YSpinnerBaseAdapter<T, D extends ViewDataBinding> extends BaseAdapter {

    ...
    
    public void setData(List<T> data) {
        this.data = data;
        notifyDataSetChanged();
    }

    //由于不顯示選中項,默認展示size-1 個
    @Override
    public int getCount() {
        if (data != null) {
            return data.size() - 1;
        } else {
            return 0;
        }
    }

    /*
     * 用于外部取item數據
     */
    public T getItemData(int position) {
        return data.get(position);
    }

    /*
     * 用于渲染item,不作為外部取item數據
     * 此處的控制邏輯實現當前index不顯示在列表中
     */
    @Override
    public T getItem(int position) {
        if (position >= mSelectedIndex) {
            return data.get(position + 1);
        } else {
            return data.get(position);
        }
    }

    public abstract String getItemContent(int position);

    public abstract void setData(T info, D dataBinding);

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            dataBinding = DataBindingUtil.inflate(LayoutInflater.from(mContext), layoutId, parent, false);
        } else {
            dataBinding = DataBindingUtil.getBinding(convertView);
        }
        //由子類實現具體數據綁定
        setData(getItem(position), dataBinding);
        dataBinding.executePendingBindings();
        return dataBinding.getRoot();
    }
}

自定義adapter繼承YSpinnerBaseAdapter

//第一個泛型可傳入任意自定義Object,此處用String測試
public class DemoAdapter extends YSpinnerBaseAdapter<String, SpinnerItemDataBinding> {

    public DemoAdapter(Context context, int layoutId) {
        super(context, layoutId);
    }

    //供Spinner調用顯示內容的數據
    @Override
    public String getItemContent(int position) {
        return data.get(position);
    }

    @Override
    public void setData(String info, SpinnerItemDataBinding dataBinding) {
        if (dataBinding != null) {
            if (dataBinding.getModel() == null) {
                dataBinding.setModel(new SpinnerModel());
            }
            dataBinding.getModel().setItemText(info);
        }
    }

}

初始化數據進行測試

String[] arr = new String[] { "one", "two", "three", "four", "five" };
        DemoDataBinding demoDataBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
        DemoAdapter adapter = new DemoAdapter(this, R.layout.layout_spinner_item);
        adapter.setData(Arrays.asList(arr));
        demoDataBinding.spinner.setAdapter(adapter);

代碼地址

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,062評論 25 709
  • 內容抽屜菜單ListViewWebViewSwitchButton按鈕點贊按鈕進度條TabLayout圖標下拉刷新...
    皇小弟閱讀 47,162評論 22 665
  • scrapy學習筆記(有示例版) 我的博客 scrapy學習筆記1.使用scrapy1.1創(chuàng)建工程1.2創(chuàng)建爬蟲模...
    陳思煜閱讀 13,084評論 4 46
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現,斷路器,智...
    卡卡羅2017閱讀 136,569評論 19 139
  • ▲ 點上方藍字關注「月亮灰」 如果你也失眠 就讓我溫暖你的眼 我所擁有的都是僥幸啊 我失去的都是人生。 2017....
    月亮灰_閱讀 557評論 0 0

友情鏈接更多精彩內容