Spinner会在很多的场景下面使用,比如选择城市,学校等,Listview的使用场景我也不用多说了,作为一个android菜鸟,我经常使用Listview。后来做项目中的一个功能,在我这个菜鸟来看,使用Spinner和Listview的结合效果还不错,但是貌似这个不是想象中的那么简单,因为Listview中的每个item都要有对应一个Spinner,这里面就出现了两个问题:
1、如何把每个Spinner中的数据放到ListView对应的item中,因为他俩都需要adapter传值
2、Spinner选中了之后,提交数据,如何把Spinner中选择的数据提交
由于这个ListView是需要用adapter传数据进去,一般使用的都是Map向里面传值,Map初始化的时候已经确定了value的类型,Spinner传值需要List,所以如果要让ListView中显示Spinner就要自定义adapter。
我的工程中Text是我自己定义的一个类,title顾名思义标题,content表示内容其实就是存放Spinner数据的数组,id是代表这个Spinner中被选中的数据的数组下标。
package com.alex.listview_spinner;
public class Text {
private String title;
private String[] content;
private int id;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String[] getContent() {
return content;
}
public void setContent(String[] content) {
this.content = content;
}
}
package com.alex.listview_spinner;
import java.util.List;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.Spinner;
import android.widget.TextView;
public class TextAdapter extends BaseAdapter{
private List<Text> texts;
private Integer resource;
private Context context;
private LayoutInflater inflater;
public TextAdapter(Context context, List<Text> text,int resource){
this.texts=text;
this.resource=resource;
this.context=context;
inflater=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
public int getCount() {
// TODO Auto-generated method stub
return texts.size();
}
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return texts.get(arg0);
}
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return arg0;
}
public View getView(int arg0, View arg1, ViewGroup arg2) {
// TODO Auto-generated method stub
if(arg1==null){
arg1=inflater.inflate(resource, null);
}
final Text text = texts.get(arg0);
TextView titleView=(TextView)arg1.findViewById(R.id.title);
final Spinner contentView=(Spinner)arg1.findViewById(R.id.content);
contentView.setTag("");
contentView.setOnItemSelectedListener(new OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
// TODO Auto-generated method stub
text.setId(arg2);//每次Spinner中的值改变,Text类中的id就要改变
}
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub
}
});
titleView.setText(text.getTitle());
ArrayAdapter<String> adapter = new ArrayAdapter<String>(context,android.R.layout.simple_list_item_single_choice,text.getContent());
contentView.setAdapter(adapter);
return arg1;
}
}
MainActivity.java代码如下:
package com.alex.listview_spinner;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.Toast;
public class MainActivity extends Activity {
/** Called when the activity is first created. */
private ListView listView;
private Button button;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
show();
button = (Button) findViewById(R.id.button1);
button.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
ListAdapter listAdapter = listView.getAdapter();
for (int i = 0; i < listAdapter.getCount(); i++) {
Text text = (Text) listAdapter.getItem(i);
Toast.makeText(
MainActivity.this,
text.getTitle() + " "
+ text.getContent()[text.getId()], 0)
.show();
}
}
});
}
private void show() {
List<Text> texts = new ArrayList<Text>();
for (int i = 0; i < 10; i++) {// 自定义的Text类存数据
Text text = new Text();
text.setTitle(String.valueOf(i));// 标题数据
String[] temp = new String[10];
for (int j = 0; j < 10; j++) {// Spinner数据
temp[j] = String.valueOf(j);
text.setId(0);// Spinner的默认选择项
text.setContent(temp);
texts.add(text);
}
TextAdapter textAdapter = new TextAdapter(MainActivity.this, texts,
R.layout.main_item);// 向自定义的Adapter中传值
listView = (ListView) findViewById(R.id.mylist);
listView.setAdapter(textAdapter);// 传值到ListView中
}
}
}
activity_main.xml代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="${relativePackage}.${activityClass}" >
<ListView
android:id="@+id/mylist"
android:layout_width="match_parent"
android:layout_height="500dp" >
</ListView>
<Button
android:id="@+id/button1"
android:layout_width="match_parent"
android:gravity="center"
android:textColor="@android:color/holo_green_light"
android:layout_height="wrap_content"
android:text="提交" />
</LinearLayout>
main_item.xml代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="match_parent"/>
<Spinner
android:id="@+id/content"
android:layout_width="wrap_content"
android:layout_height="match_parent"/>
</LinearLayout>
AndroidManifest.xml文件代码:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.alex.listview_spinner"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="25" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
运行效果:
写到这里就已经实现了所要的基本功能了,如果还需要特殊定制自己修改即可。有什么疑问可以给我留言评论