Spinner的使用

最近在做有关工作流的项目时使用到了Spinner控件,需要把从后台获取到的数据展示在Spinner控件上并选择指定特定项目名称和责任人员。刚开始接触,从网上搜罗了许多资料,也请求过几个网友,但还是在实际开发中经历了不少挫折。经过闲暇之余的反思和整理思路,最终顺利把问题解决,现把劳动成果分享给大家,仅供参考,望对君有益!

以下只是使用到Spinner控件的简化界面:

项目中使用到的负责人员是跟项目中的通讯录一致的,也就是员工Staff实体类,属性最好跟后台的属性名称一致,方便往后台传数据时,后台所需的字段跟手机端的数据一致,以下实体类类同:

public class Staff  {
// 员工id
private int contactId;
// 员工姓名
private String name;
// 电话号码
private String phone;
//员工邮箱
private String email;
//员工QQ
private String qq;
private String remark;
//使用快捷键获取实体类各属性的get和set方法
public int getContactId() {
return contactId;
}
public void setContactId(int contactId) {
this.contactId = contactId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getQq() {
return qq;
}
public void setQq(String qq) {
this.qq = qq;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
}


项目中使用到的项目Project实体类如下:

public class Project{
//工程编号
private String code;
//曾用项目名称
private String uname;
//标准项目名称
private String name;
//建设用途
private String intent;
//建设地点
private String place;
//开工日期
private Date startTime;
//竣工日期
private Date endTime;
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getIntent() {
return intent;
}
public void setIntent(String intent) {
this.intent = intent;
}
public String getPlace() {
return place;
}
public void setPlace(String place) {
this.place = place;
}
public Date getStartTime() {
return startTime;
}
public void setStartTime(Date startTime) {
this.startTime = startTime;
}
public Date getEndTime() {
return endTime;
}
public void setEndTime(Date endTime) {
this.endTime = endTime;
}
}


项目中使用到的提交项目有关的报表Report实体类如下:

public class Report  {
// 项目Id和名称
private String projectId;
private String projectName;
// 负责人Id和名称
private String userId;
private String userName;
// 0草稿,1待审核,2审核中,3审核通过,4打回
private Integer status;
// 提报时间
private Date createTime;
// 工程经理
private String engineeringManager;
// 技术经理
private String technicalManager;
// 技术主管
private String technicalDirector;
public String getProjectId() {
return projectId;
}
public void setProjectId(String projectId) {
this.projectId = projectId;
}
public String getProjectName() {
return projectName;
}
public void setProjectName(String projectName) {
this.projectName = projectName;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public String getEngineeringManager() {
return engineeringManager;
}
public void setEngineeringManager(String engineeringManager) {
this.engineeringManager = engineeringManager;
}
public String getTechnicalManager() {
return technicalManager;
}
public void setTechnicalManager(String technicalManager) {
this.technicalManager = technicalManager;
}
public String getTechnicalDirector() {
return technicalDirector;
}
public void setTechnicalDirector(String technicalDirector) {
this.technicalDirector = technicalDirector;
}
public Boolean getIsSuccess() {
return isSuccess;
}
public void setIsSuccess(Boolean isSuccess) {
this.isSuccess = isSuccess;
}
public Boolean getIsUpload() {
return isUpload;
}
public void setIsUpload(Boolean isUpload) {
this.isUpload = isUpload;
}
}


项目中使用到Spinner控件的布局界面report_add_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="match_parent"
    android:orientation="vertical" >
    
<RelativeLayout
        style="@style/styleHeadLayout"
        android:layout_width="fill_parent" >

        <TextView
            style="@style/styleTextLayout"
            android:layout_width="wrap_content"
            android:layout_centerInParent="true"
            android:text="@string/material_presentation" />
        
    </RelativeLayout>
    
<LinearLayout 
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:layout_marginTop="15dp"
   >
   <TextView 
            android:layout_width="100dp"
            android:text="@string/report_project_name"
            style="@style/styleShowTextView"
            android:textSize="18sp"
            android:gravity="center"
            android:background="@null"
            />
<!-- 展示提交项目名称用到的Spinner -->
   <Spinner 
       android:id="@+id/report_add_project_name"
       android:layout_width="0dp"
       android:layout_weight="1"
       android:layout_height="wrap_content"
       android:layout_marginRight="5dp"
       />
</LinearLayout>

<LinearLayout 
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:layout_marginTop="15dp"
   >
   <TextView 
            android:layout_width="100dp"
            android:text="@string/report_engineeringManager"
            style="@style/styleShowTextView"
            android:textSize="18sp"
            android:gravity="center"
            android:background="@null"
            />
<!-- 展示需要选择工程经理的Spinner -->
        <Spinner 
            android:id="@+id/report_add_engineeringManager"
            android:layout_width="0dp"
       android:layout_weight="1"
       android:layout_height="wrap_content"
       android:layout_marginRight="5dp"
            />
</LinearLayout>

<LinearLayout 
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:layout_marginTop="15dp"
   >
   <TextView 
            android:layout_width="100dp"
            android:text="@string/report_technicalManager"
            style="@style/styleShowTextView"
            android:textSize="18sp"
            android:gravity="center"
            android:background="@null"
            />
<!-- 展示需要选择技术经理的Spinner -->
        <Spinner 
            android:id="@+id/report_add_technicalManager"
            android:layout_width="0dp"
       android:layout_weight="1"
       android:layout_height="wrap_content"
       android:layout_marginRight="5dp"
            />
</LinearLayout>

<LinearLayout 
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:layout_marginTop="15dp"
   >
   <TextView 
            android:layout_width="100dp"
            android:text="@string/report_technicalDirector"
            style="@style/styleShowTextView"
            android:textSize="18sp"
            android:gravity="center"
            android:background="@null"
            />
<!-- 展示需要选择技术主管的Spinner -->
        <Spinner 
            android:id="@+id/report_add_technicalDirector"
            android:layout_width="0dp"
       android:layout_weight="1"
       android:layout_height="wrap_content"
       android:layout_marginRight="5dp"
            />
</LinearLayout>

<!-- <LinearLayout 
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:layout_marginTop="10dp"
   >
        
   <TextView 
       android:layout_width="120dp"
       android:layout_height="wrap_content"
       android:text="@string/"
       />
   
</LinearLayout> -->
<View 
   android:layout_width="match_parent"
   android:layout_height="0dp"
   android:layout_weight="1"
   android:visibility="invisible"
   />

<Button 
   android:id="@+id/report_submit"
   style="@style/styleButton"
   android:layout_width="match_parent"
   android:layout_marginLeft="10dp"
   android:layout_marginRight="10dp"
   android:layout_marginBottom="5dp"
   android:layout_marginTop="5dp"
   android:text="@string/report_submit"
   />
</LinearLayout>


本人在项目中根据个人喜好使用的是Spinner的下拉模式,你也可以根据个人喜好使用Spinner的对话框模式。Spinner的适配器也很简单,我是使用了自定义的布局界面,布局界面里只有一个TextView控件,只是给大家提供参考怎么给Spinner控件的适配器提供其他模式的界面而已,在此就不展示布局界面了,Spinner控件也自带了许多适配器模式,大家不妨尝试使用。

//提交报表的Activity继承自BaseActivity,BaseActivity 继承自Activity,BaseActivity里封装了Activity类中经常使用到的创建新的Activity、销毁单个或多个Activity等,也是根据个人实际开发需要编写


public class ReportAddActivity extends BaseActivity {

//@ViewInject类似于findViewById,只是把命名和初始化合为一体,减少了代码量,是ViewUtil的注解方式,大家想学ViewUtil,可以参考以下博客:
http://blog.csdn.net/jjwwmlp456/article/details/44084411,
@ViewInject(R.id.report_add_project_name)
private Spinner reportAddProjectName;
@ViewInject(R.id.report_add_engineeringManager)
private Spinner reportAddEngineeringManager;
@ViewInject(R.id.report_add_technicalManager)
private Spinner reportAddTechnicalManager;
@ViewInject(R.id.report_add_technicalDirector)
private Spinner reportAddTechnicalDirector;
private SpinnerProjectAdapter projectAdapter;
private SpinnerStaffAdapter staffAdapter;
private List<Project> projects;
private List<Staff> staffs;
private Report report;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ViewUtils.inject(this);
//为了保质保量的尽快完成项目,减少因项目崩溃而带来的烦恼,切记该初始化的一定要初始化,避免空指针现象的发生,影响了一天的工作心情
projects = new ArrayList<Project>();
staffs = new ArrayList<Staff>();
//尽可能把重复性的代码提取出来自定义个方法,使onCreate()方法中的代码条理清晰、逻辑分明,减少逻辑混乱,这样不仅有助于自己以后查看逻辑,也有助于同事查看代码,帮你调错
showProjectNames();
showStaffNames();
projectAdapter = new SpinnerProjectAdapter(this, projects);
staffAdapter = new SpinnerStaffAdapter(this, staffs);
reportAddProjectName.setAdapter(projectAdapter);
reportAddEngineeringManager.setAdapter(staffAdapter);
reportAddTechnicalManager.setAdapter(staffAdapter);
reportAddTechnicalDirector.setAdapter(staffAdapter);
report = new Report();
//提取项目名称对应的Spinner控件对应的监听器,此处只是最基本的方法,也可以自定义监听器继承自OnItemSelectedListener,也可以以实现接口的方式来使用,并重写里面的onItemSelected和onNothingSelected方法。
reportAddProjectName.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
//把需要传给后台的信息提取出来,根据实际开发需要提取
report.setProjectId(projects.get(position).getId().toString());
report.setProjectName(projects.get(position).getName().toString());
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
//提取工程经理对应的Spinner控件的监听器
reportAddEngineeringManager.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
report.setEngineeringManager(staffs.get(position).getName().toString());
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
//提取技术经理对应的Spinner控件的监听器
reportAddTechnicalManager.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
report.setTechnicalManager(staffs.get(position).getName().toString());
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
//提取技术主管对应的Spinner控件的监听器
reportAddTechnicalDirector.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
report.setTechnicalDirector(staffs.get(position).getName().toString());
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
}
//自定义的从后台获取项目名称的方法,此处的BaseRequest继承自StringRequest, BaseRequest里面重载了StringRequest,里面有成功监听、失败监听和需要上传的Map集合等参数,以下类同
private void showProjectNames(){
BaseRequest request = new BaseRequest("需要获取数据的URL", new Listener<String>() {

@Override
public void onResponse(String response) {
//项目中使用的数据解析方式是最基本的JSON方法,效率更高的可以使用GSON、FastJson、Jackson等解析方式
try {
JSONArray array = new JSONArray(response);
for (int i = 0; i < array.length(); i++) {
Project project = new Project();
JSONObject object = array.getJSONObject(i);
String name = object.getString("name");
String projectId = object.getString("id");
project.setName(name);
project.setId(projectId);
projects.add(project);
projectAdapter.notifyDataSetChanged();
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
//Volley的添加tag标签和把请求添加到请求队列的代码都封装到BaseRequest的addRequestToQueue方法中了,不要因为我这里没写就忽略啊
AppContext.getInstance().addRequestToQueue(request);
}
//自定义的从后台获取所有负责人员信息的方法
private void showStaffNames(){
BaseRequest request = new BaseRequest("从后台获取员工信息的URL", new Listener<String>() {
@Override
public void onResponse(String response) {
try {
JSONArray array = new JSONArray(response);
for (int i = 0; i < array.length(); i++) {
Staff staff = new Staff();
JSONObject object = array.getJSONObject(i);
String name = object.getString("name");
staff.setName(name);
staffs.add(staff);
staffAdapter.notifyDataSetChanged();
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
AppContext.getInstance().addRequestToQueue(request);
}
//提交按钮的监听事件,一行代码就可以解决控件点击事件的声明和初始化烦恼
@OnClick(R.id.report_submit)
public void reportSubmit(View view){
//把需要往后台传递的数据封装到Map集合中,Map中的键名一定要跟后台的字段名对应起来,尤其是大小写,本人建议实体类跟负责后台的同事要,Map集合中的键名就复制粘贴吧,避免出错率
Map<String, String> map = new HashMap<String, String>();
map.put("report.projectName", report.getProjectName());
map.put("report.projectId", report.getProjectId());
map.put("report.engineeringManager", report.getEngineeringManager());
map.put("report.technicalManager", report.getTechnicalManager());
map.put("report.technicalDirector", report.getTechnicalDirector());
BaseRequest request = new BaseRequest("report/add.action", map , new Listener<String>() {
@Override
public void onResponse(String response) {
ActivityHelper.showMsg(response);
}
}, new ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
AppContext.getInstance().addRequestToQueue(request);
//报表提交完成使用finish方法销毁此Activity,实际开发过程中的创建的Activity过多,客户多次按Back返回键找不到不到预期的Activity界面是相当苦恼的事。嘿嘿
finish();
}
}


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值