学习过了Textview,EditText,ImageView,Button 等简单View控件后,刚一看Spinner感觉有些复杂。显示数据还需要用Adapter。。。认真学习后做简单梳理 :
上面两个图介绍了Spinner显示数据的过程。是MVC模式。Spinner负责显示,Adapter负责将源数据传送到Spinner,Model存放源数据,通常是List<?>集合或者数组。
看实际使用的例子
1.准备需要加载展示的数据源。我定义在了values\Strings.xml中,代码如下:
<resources> <string name="app_name">LoginDemo</string> <string-array name="log_method"> <item>QQ登陆</item> <item>微信登陆</item> <item>手机号登陆</item> <item>微博登陆</item> </string-array> </resources>
2.初始化适配器,将数据源加载到适配器中。new 一个适配器是有三个参数,了解一下含义:
context: 上下文对象,当前类.this。resource:表示列表item的布局资源id 默认android.R.layout.simple_spinner_item,logmethod。object:要适配的数据资源。
3.将适配器加载到控件中:
import android.app.Activity; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Spinner; import android.widget.AdapterView.OnItemSelectedListener; import android.widget.TextView; import android.widget.Toast; public class LoginActivity extends Activity { private Spinner mSp1; private String [] logmethod; private ArrayAdapter<String> adapter; private TextView mTv1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); mSp1 = (Spinner)this.findViewById(R.id.sp); mTv1 = (TextView) this.findViewById(R.id.tv); //准备要加载的字符串数组资源 logmethod = getResources().getStringArray(R.array.log_method); /* * 初始化适配器时各参数 * context: 上下文对象,当前类.this * resource:表示列表item的布局资源id 默认android.R.layout.simple_spinner_item,logmethod * object:要适配的数据资源 * */ adapter = new ArrayAdapter<String>(LoginActivity.this,android.R.layout.simple_spinner_item,logmethod); mSp1.setAdapter(adapter); mSp1.setOnItemSelectedListener(new OnItemSelectedListener() { /* 参数详解: AdapterView<?> adapterView:触发当前事件的Spinner对象 View view表示当前备选中的item int i:表示当前被选中item的下表 long l:表示当前被选中item的id */ @Override public void onItemSelected(AdapterView<?> adapterView, View view, int position, long id) { String s1 = logmethod[position]; //在数据源中获取 String s2 = adapter.getItem(position); //在适配器中获取 Toast.makeText(LoginActivity.this,"s1 = "+s1,Toast.LENGTH_LONG); mTv1.setText(s1); } @Override public void onNothingSelected(AdapterView<?> adapterView) { } }); } }
Spinner的定义:
<Spinner android:id="@+id/sp" android:layout_marginLeft="10dp" android:layout_width="match_parent" android:layout_height="wrap_content" ></Spinner>
程序运行效果: