«

在Listview里面加入Spinner

时间:2024-3-2 18:52     作者:韩俊     分类: Android


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中被选中的数据的数组下标。

<span style="font-size:24px;">package zcrazy.lsh.listviewspinner;

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;
    }
}</span>

之后是自定义的adapter,在adapter中需要对Spinner进行监听,如果Spinner进行了选择,则将Text类中的id换成被选中数据的数组下标

<span style="font-size:24px;">package zcrazy.lsh.listviewspinner;

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;
    }

}</span>

之后是主函数,这个也没什么好说的,都是基础代码

<span style="font-size:24px;">package zcrazy.lsh.listviewspinner;

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 ListView_SpinnerActivity 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.main);
    button = (Button) findViewById(R.id.button1);
    show();

    button.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            ListAdapter listAdapter = listView.getAdapter();
            for(int i=0;i&lt;listAdapter.getCount();i++){
                Text text = (Text) listAdapter.getItem(i);
                Toast.makeText(ListView_SpinnerActivity.this,text.getTitle()+&quot; &quot;+text.getContent()[text.getId()], 0).show();
            }
        }
    });
}

@SuppressWarnings(&quot;static-access&quot;)
private void show(){
    List&lt;Text&gt; texts = new ArrayList&lt;Text&gt;();
    for(int i=0;i&lt;10;i++){//自定义的Text类存数据
        Text text = new Text();
        text.setTitle(String.valueOf(i));//标题数据
        String[] temp = new String[10];
        for(int j=0;j&lt;10;j++){//Spinner数据    

<span style="white-space:pre"> temp[j]=String.valueOf(j);
<span style="white-space:pre"> </span>}</span>
<span style="white-space:pre"> </span>text.setId(0);//Spinner的默认选择项
text.setContent(temp);
texts.add(text);
}
TextAdapter textAdapter = new TextAdapter(ListView_SpinnerActivity.this, texts, R.layout.main_item);//向自定义的Adapter中传值
listView=(ListView)findViewById(R.id.mylist);
listView.setAdapter(textAdapter);//传值到ListView中
}
}</span>

上面是主要的文件,接下来是不主要的文件,看一下就好了

<span style="font-size:24px;"><?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <ListView 
        android:id="@+id/mylist"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
    ></ListView>

     <Button 
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="提交"
    />

</LinearLayout></span></span>
<span style="font-size:24px;"><span style="font-family:Times New Roman;"><?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="match_parent"
    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></span>
<span style="font-size:24px;"><?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="zcrazy.lsh.listviewspinner"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="14" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:label="@string/app_name"
            android:name=".ListView_SpinnerActivity" >
            <intent-filter >
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest></span>


效果图如下:


好了我的第一次就这么快,结束了,不知道能不能让大家看得懂,也不知道会有多少人看到,如果有问题可以给我留言。如果转载了请标明出处

标签: android

热门推荐