package cn.qqtheme.framework.picker;
import android.app.Activity;
import android.support.annotation.NonNull;
import android.text.TextUtils;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import cn.qqtheme.framework.util.ConvertUtils;
import cn.qqtheme.framework.widget.WheelView;
/**
* 单项选择器
*
* @author 李玉江[QQ:1032694760]
* @since 2015/9/29
*/
public class SinglePicker<T> extends WheelPicker {
private static final int ITEM_WIDTH_UNKNOWN = -99;
private List<T> items = new ArrayList<>();
private List<String> itemStrings = new ArrayList<>();
private WheelView wheelView;
private OnWheelListener<T> onWheelListener;
private OnItemPickListener<T> onItemPickListener;
private int selectedItemIndex = 0;
private String label = "";
private int itemWidth = ITEM_WIDTH_UNKNOWN;
public SinglePicker(Activity activity, T[] items) {
this(activity, Arrays.asList(items));
}
public SinglePicker(Activity activity, List<T> items) {
super(activity);
setItems(items);
}
/**
* 添加数据项
*/
public void addItem(T item) {
items.add(item);
itemStrings.add(formatToString(item));
}
/**
* 移除数据项
*/
public void removeItem(T item) {
items.remove(item);
itemStrings.remove(formatToString(item));
}
/**
* 设置数据项
*/
public void setItems(T[] items) {
setItems(Arrays.asList(items));
}
/**
* 设置数据项
*/
public void setItems(List<T> items) {
if (null == items || items.size() == 0) {
return;
}
this.items = items;
for (T item : items) {
itemStrings.add(formatToString(item));
}
if (null != wheelView) {
wheelView.setItems(itemStrings, selectedItemIndex);
}
}
/**
* 设置显示的单位,如身高为cm、体重为kg
*/
public void setLabel(String label) {
this.label = label;
}
/**
* 设置默认选中的项的索引
*/
public void setSelectedIndex(int index) {
if (index >= 0 && index < items.size()) {
selectedItemIndex = index;
}
}
/**
* 设置默认选中的项
*/
public void setSelectedItem(@NonNull T item) {
setSelectedIndex(itemStrings.indexOf(formatToString(item)));
}
/**
* 设置选项的宽(dp)
*/
public void setItemWidth(int itemWidth) {
if (null != wheelView) {
ViewGroup.LayoutParams params = wheelView.getLayoutParams();
params.width = ConvertUtils.toPx(activity, itemWidth);
wheelView.setLayoutParams(params);
} else {
this.itemWidth = itemWidth;
}
}
/**
* 设置滑动过程监听器
*/
public void setOnWheelListener(OnWheelListener<T> onWheelListener) {
this.onWheelListener = onWheelListener;
}
/**
* 设置确认选择监听器
*/
public void setOnItemPickListener(OnItemPickListener<T> listener) {
this.onItemPickListener = listener;
}
@Override
@NonNull
protected View makeCenterView() {
if (items.size() == 0) {
throw new IllegalArgumentException("Items can't be empty");
}
LinearLayout layout = new LinearLayout(activity);
layout.setLayoutParams(new ViewGroup.LayoutParams(MATCH_PARENT, WRAP_CONTENT));
layout.setOrientation(LinearLayout.HORIZONTAL);
layout.setGravity(Gravity.CENTER);
wheelView = createWheelView();
//wheelView.setLabel(label);
layout.addView(wheelView);
if (TextUtils.isEmpty(label)) {
wheelView.setLayoutParams(new LinearLayout.LayoutParams(screenWidthPixels, WRAP_CONTENT));
} else {
wheelView.setLayoutParams(new LinearLayout.LayoutParams(WRAP_CONTENT, WRAP_CONTENT));
TextView labelView = createLabelView();
labelView.setText(label);
layout.addView(labelView);
}
wheelView.setItems(itemStrings, selectedItemIndex);
wheelView.setOnItemSelectListener(new WheelView.OnItemSelectListener() {
@Override
public void onSelected(int index) {
selectedItemIndex = index;
if (onWheelListener != null) {
onWheelListener.onWheeled(selectedItemIndex, items.get(index));
}
}
});
if (itemWidth != ITEM_WIDTH_UNKNOWN) {
ViewGroup.LayoutParams params = wheelView.getLayoutParams();
params.width = ConvertUtils.toPx(activity, itemWidth);
wheelView.setLayoutParams(params);
}
return layout;
}
private String formatToString(T item) {
if (item instanceof Float || item instanceof Double) {
return new DecimalFormat("0.00").format(item);
}
return item.toString();
}
@Override
public void onSubmit() {
if (onItemPickListener != null) {
onItemPickListener.onItemPicked(selectedItemIndex, getSelectedItem());
}
}
public T getSelectedItem() {
return items.get(selectedItemIndex);
}
public int getSelectedIndex() {
return selectedItemIndex;
}
public WheelView getWheelView() {
return wheelView;
}
public interface OnItemPickListener<T> {
void onItemPicked(int index, T item);
}
public interface OnWheelListener<T> {
void onWheeled(int index, T item);
}
}