spinner控件什么意思,spinner ui
具有多选功能的spinner自定义控件
1、首先需要用TextView来显示选择信息,在上面说明了,就继承TextView,在弹出对话框的时候需要一个标题,我们也传进来。然后就是要显示的数据集,因为考虑到可能显示的样式会和需要的值不一样,这里我们就自己定义一个类给它一个Name和Value属性。
此外还有被选择的数据集,就用Set来存放。定义需要的属性,生成相应的get和set方法。
public class MultiSpinner extends TextView implements View.OnClickListener,DialogInterface.OnClickListener{
private ListView listView;
private Context context;
private String title;
private ListSimpleSpinnerOption dataList;
private Adapter adapter;
private SetObject checkedSet;
private int selectCount=-1;
private boolean isEmpty(){
return dataList==null?true:dataList.isEmpty();
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public void setCheckedSet(SetObject checkedSet) {
this.checkedSet = checkedSet;
showSelectedContent();
}
public ListSimpleSpinnerOption getDataList() {
return dataList;
}
public int getSelectCount() {
return selectCount;
}
public void setSelectCount(int selectCount) {
this.selectCount = selectCount;
}
public void setDataList(ListSimpleSpinnerOption dataList) {
this.dataList = dataList;
if (adapter==null){
adapter=new Adapter(dataList);
this.listView.setAdapter(adapter);
}else {
adapter.setList(dataList);
adapter.notifyDataSetChanged();
}
}
public MultiSpinner(Context context) {
super(context, null);
}
public MultiSpinner(Context context, AttributeSet attrs) {
super(context, attrs);
this.context=context;
this.setOnClickListener(this);
listView=new ListView(context);
listView.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT));
adapter = new Adapter(null);
this.listView.setAdapter(adapter);
}
public MultiSpinner(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
}
数据类型SimpleSpinnerOption的代码如下:
public class SimpleSpinnerOption {
private String name;
private Object value;
public SimpleSpinnerOption(){
this.name="";
this.value="";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Object getValue() {
return value;
}
public void setValue(Object value) {
this.value = value;
}
}
在上面的代码中,我们在初始化的时候为该控件本身设置了监听事件,由于此时还不知道数据源,所以为ListView设置了一个空的数据集。而在setDataList方法中拿到数据源并设置给listView中用于显示。为了显示出来,我们在控件本身的onClick事件中做显示工作,代码如下:
@Override
public void onClick(View view) {
ViewGroup parent=(ViewGroup)listView.getParent();
if(parent!=null){
parent.removeView(listView);
}
if (dataList==null){
Log.d("MultiSpinner","no data to show");
}
adapter.setCheckedSet(checkedSet);
new AlertDialog.Builder(context)
.setTitle(title)
.setPositiveButton("确定",this)
.setNegativeButton("取消",this)
.setView(listView).show();
}1234567891011121314151612345678910111213141516
我们在onClick中弹出一个对话框让listview能够进行显示。并且设置了相应的点击事件。由于如果之前已经选择过了,再次点击控件,应该能把选择的效果还原出来。所以用adapter.setCheckedSet(checkedSet)来把已经选择的数据传入adapter中进行处理。
接下来看一下Adapter适配器的代码:
class Adapter extends BaseAdapter implements OnClickListener {
private ListSimpleSpinnerOption list;
private SetObject checkedSet;
public Adapter(ListSimpleSpinnerOption list){
this.list=list;
checkedSet=new HashSetObject();
}
public void setList(ListSimpleSpinnerOption list) {
this.list = list;
}
public SetObject getCheckedSet(){
return this.checkedSet;
}
public void setCheckedSet(SetObject checkedSet) {
this.checkedSet=new HashSetObject();
if(checkedSet!=null){
this.checkedSet.addAll(checkedSet);
}
}
@Override
public int getCount() {
return list==null?0:list.size();
}
@Override
public Object getItem(int position) {
return list==null?null:list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
SimpleSpinnerOption mul=(SimpleSpinnerOption)this.getItem(position);
Wrapper wrapper=null;
if(convertView==null){
convertView = LayoutInflater.from(MultiSpinner.this.getContext()).inflate(R.layout.multi_spinner_item,null);
wrapper=new Wrapper();
wrapper.textView=(TextView)convertView.findViewById(R.id.textView);
wrapper.checkBox=(CheckBox)convertView.findViewById(R.id.checkBox);
wrapper.checkBox.setOnClickListener(this);
convertView.setTag(wrapper);
}
wrapper=(Wrapper)convertView.getTag();
wrapper.textView.setText(mul.getName());
if(checkedSet!=null){
if(checkedSet.contains(mul.getValue())){
wrapper.checkBox.setChecked(true);
}else{
wrapper.checkBox.setChecked(false);
}
}
wrapper.checkBox.setTag(position);
return convertView;
}
@Override
public void onClick(View v) {
CheckBox checkBox=(CheckBox)v;
Integer position=(Integer)checkBox.getTag();
if(position==null){
return;
}
SimpleSpinnerOption op=(SimpleSpinnerOption)getItem(position);
if(checkBox.isChecked()){
int maxCount= MultiSpinner.this.getSelectCount();
if(maxCount-1checkedSet.size()=maxCount){
checkBox.setChecked(false);
Toast.makeText(MultiSpinner.this.getContext(), String.format("最多只能选择 %s 个", selectCount), Toast.LENGTH_SHORT).show();
return;
}
checkedSet.add(op.getValue());
}else{
checkedSet.remove(op.getValue());
}
}
class Wrapper{
public TextView textView;
public CheckBox checkBox;
}
}
在适配器的item布局里,用一个textview来显示文字,用checkbox来显示选中状态。在getView中判断是否已经选择修改checkbox的状态。同时在checkbox的点击事件中进行选择值checkedSet的修改。
最后是我们点击确定取消按钮的逻辑:
@Override
public void onClick(DialogInterface dialogInterface, int i) {
switch (i){
case -1:
this.checkedSet=adapter.getCheckedSet();
showSelectedContent();
break;
}
}
private void showSelectedContent(){
StringBuilder sb=new StringBuilder();
for(SimpleSpinnerOption option:getCheckedOptions()){
sb.append(option.getName()).append(",");
}
if(sb.length()0){
sb.setLength(sb.length()-1);
}
setText(sb.toString());
}
代码很简单,就是拿到数据集之后进行一下展示,你也可以根据自己想要的展示方式进行修改。
使用就在代码中找到控件同时设置一下数据集就ok了。在需要拿选择数据的时候调用multiSpinner.getCheckedOptions()做自己的处理。
multiSpinner = (MultiSpinner) findViewById(R.id.mulSpinner);
multiSpinner.setTitle("月份选择");
ArrayList multiSpinnerList=new ArrayList();
for(int i=0;i12;i++){
SimpleSpinnerOption option=new SimpleSpinnerOption();
option.setName((i+1)+" 月");
option.setValue(i+1);
multiSpinnerList.add(option);
}
multiSpinner.setDataList(multiSpinnerList);
到这里就实现了一个可以多选的类似于的spinner控件啦
android 的spinner是一个什么作用的控件
可以使用Button加ListPopupWindow实现和spinner一样的效果,并且可以监听到点击事件(Spinner是不能设置点击事件的)
布局文件,只有一个button
?xml version="1.0" encoding="utf-8"?
LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
Button
android:id="@+id/button"
android:layout_width="100dp"
android:layout_height="50dp"
/
/LinearLayout
代码
public class MainActivity extends Activity {
private Button button;
private ListPopupWindow popupWindow;
private ListString strings;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
strings = new ArrayListString();
strings.add("item1");
strings.add("item2");
strings.add("item3");
button = (Button)findViewById(R.id.button);
popupWindow = new ListPopupWindow(this);
popupWindow.setAdapter(new ArrayAdapterString(this,android.R.layout.simple_list_item_1,strings));
popupWindow.setAnchorView(button);
popupWindow.setWidth(LayoutParams.WRAP_CONTENT);
popupWindow.setHeight(LayoutParams.WRAP_CONTENT);
popupWindow.setModal(true);
popupWindow.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView? parent, View view,
int position, long id) {
// TODO Auto-generated method stub
button.setText(strings.get(position));
popupWindow.dismiss();
}
});
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
popupWindow.show();
}
});
}
}
Android 的那个控件为什么叫 Spinner
不要深究控件的名字,除非是coder本人说的,否则任何答案都不可信。比如你我都知道smartbar一点也不smart
spinner词根是spin
(vi.纺纱;吐(丝),作(茧),结网;快速旋转;眩晕vt.纺(线);吐丝,将…抽成丝;讲述,尤指通过想象地;使延长,使延伸) 想象一下纺纱或吐丝的过程,都是从一个结点可以延伸出一个网,意味着将它展示出来,从而让人们能够看到更多的内容。
spinner是什么意思?
spinner
英 [?sp?n?(r)] ? ? ?美 [?sp?n?]
n.纺纱机;纺纱工;(钓鱼用)旋式诱饵
复数: spinners
扩展资料:
例句
1、These?methods?place?a?spinner?icon?and?remove?it,?respectively,?inside?of?an?HTML?div?element.
在HTML?div元素内,这些方法分别布置了旋转器图标并删除了它。
2、Another?option?for?hiding?and?showing?data?on?a?page?is?the?spinner.
在页面中隐藏和显示数据的另一选择就是微调控制项(spinner)。
3、Now?we?can?see?the?values?that?will?be?used?for?the?spinner.
现在,我们可以看到将用于微调器的那些值。
4、He?was?also?a?famous?humorist,?a?spinner?of?yarns.
他又是著名的幽默家和讲故事的好手。
5、Finally,?another?JavaScript?event?will?fire,?turning?off?the?spinner.
最后,将启动另一个JavaScript事件,关闭旋转器。
参考资料:百度翻译-spinner