基于Spinner实现的三级联动、多级联动

废话不多说直接上代码:

import android.content.Context;
import android.content.SharedPreferences;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * Created by chenxiaoli on 2017/3/6 0006.
 *基于Spinner实现的多级列表
 * 可以开启本地缓存,
 * 也可以通过getPosition获取索引自己实现缓存
 */

public class MultistageSpinnerHelper {
    private static final String SELETE_POSITION = "selectPosition";
    private static final String ID = "id";
    private OnAddressChangerListener listener;
    private MultistageBean[] multistageBeans;
    private ArrayList
   
   
    
     multistageBeens;
    private boolean isSaveCache;//是否使用实时缓存
    private SharedPreferences sp;
    private String id;
    private ArrayList[] arrayLists;//所有列表集合
    private int[] positions;//所有索引数组

  

    public interface OnAddressChangerListener {
        void onAddressChanger(MultistageBean[] multistageBeans);
    }

    public MultistageSpinnerHelper(ArrayList
    
    
     
      multistageBeens) {
        this.multistageBeens = multistageBeens;
    }

    /**
     * 选择条目变更的监听
     *
     * @param listener
     */
    public void setOnAddressChangeListener(OnAddressChangerListener listener) {
        this.listener = listener;

    }

    public void setSpinnerData(final Context context, final Spinner... spinners) {
        int spinnersLength = spinners.length;
        positions = new int[spinnersLength];
        initCache(context, spinnersLength);//读取缓存
        arrayLists = new ArrayList[spinnersLength];
        multistageBeans = new MultistageBean[spinnersLength];
        final List spinnerList = Arrays.asList(spinners);
        for (int i = 0; i < spinnersLength; i++) {
            arrayLists[i] = new ArrayList();
            if (i == 0) {//第一个条目是集合
                for (MultistageBean bean : multistageBeens) {
                    arrayLists[0].add(bean.name);
                }
                ArrayAdapter
     
     
      
       adapter = new ArrayAdapter
      
      
       
       (context, android.R.layout.simple_spinner_dropdown_item, arrayLists[i]);
                spinners[i].setAdapter(adapter);
                spinners[i].setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {//设置首条目监听
                    @Override
                    public void onItemSelected(AdapterView
       
        parent, View view, final int position, long id) {
                        int i = spinnerList.indexOf(parent);
                        multistageBeans[i] = multistageBeens.get(position);
                        //       provincePosition = position;
                        if (isSaveCache) {//保存本地缓存
                            if (sp == null) {
                                sp = context.getSharedPreferences("MultistageSpinnerHelper" + MultistageSpinnerHelper.this.id, Context.MODE_PRIVATE);
                            }
                            sp.edit().putInt(SELETE_POSITION + i, position).commit();
                        }
                        if (listener != null) {
                            listener.onAddressChanger(multistageBeans);
                        }
                        if (i + 1 < spinners.length && multistageBeans[i].children != null) {
                            arrayLists[i + 1].clear();
                            for (MultistageBean bean : multistageBeans[i].children) {
                                arrayLists[i + 1].add(bean.name);
                            }
                            ArrayAdapter
       
       
         adapter22 = new ArrayAdapter<>(context, android.R.layout.simple_spinner_dropdown_item, arrayLists[i + 1]); spinners[i + 1].setAdapter(adapter22); spinners[i + 1].setSelection(positions[i + 1]); } } @Override public void onNothingSelected(AdapterView 
         parent) { } }); } else { ArrayAdapter 
        
          adapter = new ArrayAdapter 
         
           (context, android.R.layout.simple_spinner_dropdown_item, arrayLists[i]); spinners[i].setAdapter(adapter); spinners[i].setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {//设置其余条目监听 @Override public void onItemSelected(AdapterView 
           parent, View view, final int position, long id) { int i = spinnerList.indexOf(parent); multistageBeans[i] = multistageBeans[i - 1].children.get(position); // provincePosition = position; if (isSaveCache) {//保存本地缓存 if (sp == null) { sp = context.getSharedPreferences("MultistageSpinnerHelper" + MultistageSpinnerHelper.this.id, Context.MODE_PRIVATE); } sp.edit().putInt(SELETE_POSITION + i, position).commit(); } if (listener != null) { listener.onAddressChanger(multistageBeans); } if (i + 1 < spinners.length && multistageBeans[i] != null && multistageBeans[i].children != null) { arrayLists[i + 1].clear(); for (MultistageBean bean : multistageBeans[i].children) { arrayLists[i + 1].add(bean.name); } ArrayAdapter 
          
            adapter22 = new ArrayAdapter<>(context, android.R.layout.simple_spinner_dropdown_item, arrayLists[i + 1]); spinners[i + 1].setAdapter(adapter22); spinners[i + 1].setSelection(positions[i + 1]); } } @Override public void onNothingSelected(AdapterView 
            parent) { } }); } } spinners[0].setSelection(positions[0]); } /** * 读取本地缓存 */ private void initCache(Context context, int length) { sp = context.getSharedPreferences("MultistageSpinnerHelper" + id, Context.MODE_PRIVATE); for (int i = 0; i < length; i++) { positions[i] = sp.getInt(SELETE_POSITION + i, 0); } } /** * @return 返回选中的数据 */ public MultistageBean[] getMultistageBeans() { return multistageBeans; } /** * @return 返回选中的索引 */ public int[] getPositions() { return positions; } /** * @param saveCache * @param Tag,根据id存取缓存数据 是否开启多用户本地缓存 * 默认不开启 * 需要在setSpinnerAddress方法前调用 */ public void openCache(boolean saveCache, String Tag) { this.isSaveCache = saveCache; this.id = Tag; } /** * @param saveCache 是否开启单用户本地缓存 * 默认不开启 * 需要在setSpinnerAddress方法前调用 */ public void openCache(boolean saveCache) { openCache(saveCache, ""); } 
           
          
         
       
      
      
     
     
    
    
   
   
同时还需要一个这样的bean类

import java.util.List;

/**
 * Created by lee3219237 on 2017/3/2 0002.
 */

public class MultistageBean {

    /**
     * children : [{"children":[{"city_id":110100,"entityId":110101,"id":110101,"name":"东城区","persistent":true},{"city_id":110100,"entityId":110102,"id":110102,"name":"西城区","persistent":true},{"city_id":110100,"entityId":110103,"id":110103,"name":"崇文区","persistent":true},{"city_id":110100,"entityId":110104,"id":110104,"name":"宣武区","persistent":true},{"city_id":110100,"entityId":110105,"id":110105,"name":"朝阳区","persistent":true},{"city_id":110100,"entityId":110106,"id":110106,"name":"丰台区","persistent":true},{"city_id":110100,"entityId":110107,"id":110107,"name":"石景山区","persistent":true},{"city_id":110100,"entityId":110108,"id":110108,"name":"海淀区","persistent":true},{"city_id":110100,"entityId":110109,"id":110109,"name":"门头沟区","persistent":true},{"city_id":110100,"entityId":110111,"id":110111,"name":"房山区","persistent":true},{"city_id":110100,"entityId":110112,"id":110112,"name":"通州区","persistent":true},{"city_id":110100,"entityId":110113,"id":110113,"name":"顺义区","persistent":true},{"city_id":110100,"entityId":110114,"id":110114,"name":"昌平区","persistent":true},{"city_id":110100,"entityId":110115,"id":110115,"name":"大兴区","persistent":true},{"city_id":110100,"entityId":110116,"id":110116,"name":"怀柔区","persistent":true},{"city_id":110100,"entityId":110117,"id":110117,"name":"平谷区","persistent":true}],"id":110100,"name":"市辖区","parent_id":110000},{"children":[{"city_id":110200,"entityId":110228,"id":110228,"name":"密云县","persistent":true},{"city_id":110200,"entityId":110229,"id":110229,"name":"延庆县","persistent":true}],"id":110200,"name":"县","parent_id":110000}]
     * id : 110000
     * name : 北京市
     * parent_id : 0
     */

    public int id;
    public String name;
    public int parent_id;
    public List
   
   
    
     children;

}

   
   
在activity中使用它实现一个三级联动地址

import com.google.gson.reflect.TypeToken;
import com.google.gson.Gson;

public class MyActivity extends Activity{

private Spinner spinnerProvice1;//省
private Spinner spinnerCity1;//市
private Spinner spinnerCounty1;//县

private Spinner spinnerProvice2;//上班地点省
private Spinner spinnerCity2;//上班地点市
private Spinner spinnerCounty2;//上班地点县
private Button button;//下一步,保存
private MultistageSpinnerHelper multistageSpinnerHelper1;
private MultistageSpinnerHelper multistageSpinnerHelper2;
private ArrayList
   
   
    
     address;//包含省市县地址的对象

  
  @Override
    protected void onCreate(Bundle savedInstanceState) {
         setContentView(resource);
         spinnerProvice1 = findviewbyid(...);
          spinnerCity1 = findviewbyid(...);
           spinnerCounty1 = findviewbyid(...);
          spinnerProvice2 = findviewbyid(...);
          spinnerCity2 = findviewbyid(...);
           spinnerCounty2 = findviewbyid(...);
           button = findviewbyid(...);
           new Thread(){
            public void run(){
                AssetManager manager = getAssets();
                try {
                    InputStreamReader inputReader = new InputStreamReader(manager.open("city.json") );//读取asset文件夹中的地址json文件
                    BufferedReader bufReader = new BufferedReader(inputReader);
                    String line="";
                    String Result="";
                    while((line = bufReader.readLine()) != null)
                        Result += line;
                    Type type = new TypeToken
    
    
     
     
      
      >()
                    {}.getType();
                    Gson gson = new Gson();
                   address = gson.fromJson(Result, type);//将json转化为对象
                } catch (IOException e) {
                    e.printStackTrace();
                }
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            multistageSpinnerHelper1 = new MultistageSpinnerHelper(address);
                            multistageSpinnerHelper1.openCache(true,"tag1"+"用户uid");//开启本地缓存,这里可以设置缓存标识,用于区别不同页面或不同用户
                            multistageSpinnerHelper1.setSpinnerData(MyActivity.this, spinnerProvice1, spinnerCity1, spinnerCounty1);
                            multistageSpinnerHelper2 = new MultistageSpinnerHelper(address);
                            multistageSpinnerHelper2.openCache(true,"tag2"+"用户uid");//开启本地缓存,这里可以设置缓存标识,用于区别不同页面或不同用户
                            multistageSpinnerHelper2.setSpinnerData(MyActivity.this, spinnerProvice2, spinnerCity2, spinnerCounty2);
                        }
                    });
            }
        }.start();
        
         button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                 MultistageBean[] multistageBeen1 = multistageSpinnerHelper1.getMultistageBeans();//通过get方法
                 Toast.makeText(this,multistageBeen1[0].name+":"+ multistageBeen1[1].name+":"+ multistageBeen1[2].name,Toast.LENGTH_SHORT).show();
                  MultistageBean[] multistageBeen2 = multistageSpinnerHelper2.getMultistageBeans();//通过get方法
                 Toast.makeText(this,multistageBeen2[0].name+":"+ multistageBeen2[1].name+":"+ multistageBeen2[2].name,Toast.LENGTH_SHORT).show();
            }
        });
    }
    
}
     
     
    
    
   
   

当然目前能够实现的页面效果还非常简单,以后有时间再更新。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spinner 的二级联可以通过以下步骤实现: 1. 在 layout 文件中添加两个 Spinner 控件,一个用于选择一级选项,另一个用于选择二级选项。 2. 在 Java 代码中为第一个 Spinner 设置适配器,适配器中包含一级选项的数据源。 3. 在第一个 Spinner 的选择事件中获取当前选择的一级选项,并根据该选项获取对应的二级选项数据源。 4. 为第二个 Spinner 设置适配器,适配器中包含二级选项的数据源。 5. 在第二个 Spinner 的选择事件中获取当前选择的二级选项。 下面是一个简单的示例代码,演示如何实现 Spinner 的二级联: ```java // 获取 layout 文件中的 Spinner 控件 Spinner spinner1 = findViewById(R.id.spinner1); Spinner spinner2 = findViewById(R.id.spinner2); // 定义一级选项和二级选项的数据源 String[] items1 = {"选项1", "选项2", "选项3"}; String[][] items2 = { {"选项1-1", "选项1-2", "选项1-3"}, {"选项2-1", "选项2-2", "选项2-3"}, {"选项3-1", "选项3-2", "选项3-3"} }; // 为第一个 Spinner 设置适配器 ArrayAdapter<String> adapter1 = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, items1); adapter1.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinner1.setAdapter(adapter1); // 第一个 Spinner 的选择事件 spinner1.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { // 获取当前选择的一级选项 String item1 = items1[position]; // 根据一级选项获取对应的二级选项数据源 String[] item2 = items2[position]; // 为第二个 Spinner 设置适配器 ArrayAdapter<String> adapter2 = new ArrayAdapter<>(MainActivity.this, android.R.layout.simple_spinner_item, item2); adapter2.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinner2.setAdapter(adapter2); } @Override public void onNothingSelected(AdapterView<?> parent) { // do nothing } }); // 第二个 Spinner 的选择事件 spinner2.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { // 获取当前选择的二级选项 String item2 = (String) parent.getItemAtPosition(position); // do something with item2 } @Override public void onNothingSelected(AdapterView<?> parent) { // do nothing } }); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值