android spinner异步加载数据并显示
作者:@meng232113
本文为作者原创,转载请注明出处:https://www.cnblogs.com/Meng2113/p/13667354.html
一开始直接绑定适配器发现点击后并不能显示选中的值。
解决办法:利用handle来更新UI。
我利用接口和okhttp的get方法从数据库拿到所有省份信息的json数据,在android中定义了一个province实体类来接收list。
province类
package com.example.demo.entity; public class Province { private String province; private Province(){} public String getProvince() { return province; } public Province(String province) { this.province = province; } public void setProvince(String province) { this.province = province; } }
重写adapter类实现该方法

package com.example.demo.entity; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; import com.example.demo.R; import java.util.List; public class MapAdapter extends BaseAdapter { private Context context; private List<Province> mData; public MapAdapter(List<Province> mData, Context context) { this.mData = mData; this.context = context; } @Override public int getCount() { return mData != null ? mData.size() : 0; } @Override public Object getItem(int position) { return mData.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = null; if (convertView == null) { holder = new ViewHolder(); convertView = LayoutInflater.from(context).inflate(R.layout.item_spin_map , parent , false); holder.name = (TextView) convertView.findViewById(R.id.map_name); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.name.setText(mData.get(position).getProvince()); return convertView; } static class ViewHolder { private TextView name; } }
重点:在activity的onCreate方法中先使用okhttp的get方法获得spinner要显示的对象,此时,
适配器的set语句(下面三句)不能与get方法一起放在onCreate方法中。因为数据是异步加载的。
mapAdapter = new MapAdapter(provinceData,context); spin_Province.setAdapter(mapAdapter); spin_Province.setOnItemSelectedListener(MapPageActivity.this);
利用handle类来完成适配
private Handler myHandler = new Handler() { @Override //重写handleMessage方法,根据msg中what的值判断是否执行后续操作 public void handleMessage(Message msg) { if (msg.what == 0) { mapAdapter = new MapAdapter(provinceData,context); spin_Province.setAdapter(mapAdapter); spin_Province.setOnItemSelectedListener(MapPageActivity.this); } } };
启动这个类的语句放在上面get方法的末尾,确保数据全部拿到了,再适配
myHandler.sendEmptyMessage(0);
总体activity类如下:

package com.example.demo.activity; import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.util.Log; import android.view.View; import android.widget.AdapterView; import android.widget.Button; import android.widget.Spinner; import android.widget.Toast; import com.example.demo.ActivityCollector; import com.example.demo.R; import com.example.demo.entity.Province; import com.example.demo.entity.MapAdapter; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import org.json.JSONArray; import java.io.IOException; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.List; import java.util.Timer; import java.util.TimerTask; import okhttp3.Call; import okhttp3.Callback; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; public class MapPageActivity extends Activity implements AdapterView.OnItemSelectedListener{ private Button btnCity,btnCounty; private Spinner spin_Province; private Context context; private List<Province> provinceData; private MapAdapter mapAdapter = null; //判断是否为刚进去时触发onItemSelected的标志 private boolean one_selected = false; private boolean two_selected = false; @Override protected void onCreate(Bundle savedInstanceState) { context = this; super.onCreate(savedInstanceState); setContentView(R.layout.map_page); provinceData = new ArrayList<>(); ActivityCollector.addActivity(this); spin_Province = (Spinner)findViewById(R.id.spin_province); btnCity = (Button)findViewById(R.id.btncity); btnCounty = (Button)findViewById(R.id.btncounty); getProvince(); } private void init(){ } private void getProvince() { //第一步获取okHttpClient对象 OkHttpClient client = new OkHttpClient.Builder() .build(); //第二步构建Request对象 String url = "http://192.168.236.1:8181/sewagePlant/province"; Request request = new Request.Builder() .url(url) .get() .build(); //第三步构建Call对象 Call call = client.newCall(request); //第四步:异步get请求 call.enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { Log.i("ttit", e.getMessage()); } @Override public void onResponse(Call call, Response response) throws IOException { //得到的子线程 String result = response.body().string(); Gson gson = new Gson(); // Type type = new TypeToken<List<Province>>(){}.getType(); List<Province> provinces = gson.fromJson(result, new TypeToken<List<Province>>() {}.getType()); for (int i = 0; i <provinces.size() ; i++) { Province p = provinces.get(i); provinceData.add(p); Log.i("ttit",p.getProvince()); } myHandler.sendEmptyMessage(0); } }); } @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long l) { switch (parent.getId()){ case R.id.spin_province: if (one_selected){ Toast.makeText(MapPageActivity.this,"选择了"+parent.getItemAtPosition(position).toString(),Toast.LENGTH_SHORT).show(); }else { one_selected = true; } break; } } @Override public void onNothingSelected(AdapterView<?> adapterView) { } private Handler myHandler = new Handler() { @Override //重写handleMessage方法,根据msg中what的值判断是否执行后续操作 public void handleMessage(Message msg) { if (msg.what == 0) { mapAdapter = new MapAdapter(provinceData,context); spin_Province.setAdapter(mapAdapter); spin_Province.setOnItemSelectedListener(MapPageActivity.this); } } }; }
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程