spinner控件什么意思,spinner ui

http://www.itjxue.com  2023-01-07 14:10  来源:未知  点击次数: 

具有多选功能的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

(责任编辑:IT教学网)

更多

推荐linux文章