一:布局文件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".Activity5"
android:padding="20dp">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="获取listView中下拉框和输入框的值"
android:textSize="23sp"
android:gravity="center"/>
<HorizontalScrollView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginTop="50dp"
android:layout_marginBottom="100dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
android:layout_width="80dp"
android:layout_height="wrap_content"
android:text="编号"
android:gravity="center"
android:padding="3dp"
android:background="@drawable/bg_border_tab"/>
<TextView
android:layout_width="100dp"
android:layout_height="wrap_content"
android:text="姓名"
android:gravity="center"
android:padding="3dp"
android:background="@drawable/bg_border_tab"/>
<TextView
android:layout_width="60dp"
android:layout_height="wrap_content"
android:text="年龄"
android:gravity="center"
android:padding="3dp"
android:background="@drawable/bg_border_tab"/>
<TextView
android:layout_width="60dp"
android:layout_height="wrap_content"
android:text="性别"
android:gravity="center"
android:padding="3dp"
android:background="@drawable/bg_border_tab"/>
<TextView
android:layout_width="90dp"
android:layout_height="wrap_content"
android:text="是否回家"
android:gravity="center"
android:padding="3dp"
android:background="@drawable/bg_border_tab"/>
<TextView
android:layout_width="150dp"
android:layout_height="wrap_content"
android:text="回家方式"
android:gravity="center"
android:padding="3dp"
android:background="@drawable/bg_border_tab"/>
</LinearLayout>
<ListView
android:id="@+id/list"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
</HorizontalScrollView>
<Button
android:id="@+id/btn_submit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="提交"
android:layout_above="@+id/btn"/>
<Button
android:id="@+id/btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="返回"
android:layout_alignParentBottom="true"/>
</RelativeLayout>
二:自定义ListView适配器EditSpinnerAdapter
package com.example.test.tools;
import android.content.Context;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;
import com.example.test.Activity5;
import com.example.test.R;
import com.example.test.entity.Dict;
import java.util.List;
import java.util.Map;
public class EditSpinnerAdapter extends BaseAdapter {
private Context context;
private List<Map<String, String>> list;
private Map<String, List<Dict>> map;
private LayoutInflater inflater;
public EditSpinnerAdapter(Context context, List<Map<String, String>> list, Map<String, List<Dict>> map) {
this.context = context;
this.list = list;
this.map = map;
inflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
holder = new ViewHolder();
convertView = inflater.inflate(R.layout.list, null);
holder.go_home = convertView.findViewById(R.id.go_home);
holder.way = convertView.findViewById(R.id.way);
holder.number = convertView.findViewById(R.id.number);
holder.name = convertView.findViewById(R.id.name);
holder.age = convertView.findViewById(R.id.age);
holder.gender = convertView.findViewById(R.id.gender);
SpinnerArrayAdapter adapter = new SpinnerArrayAdapter(context, map.get("go_home"));
holder.go_home.setAdapter(adapter);
holder.go_home.setOnItemSelectedListener(new MyOnItemSelectListener(holder.go_home, holder.way));
holder.way.addTextChangedListener(new MyTextChangListener(holder.way));
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.number.setText(list.get(position).get("number"));
holder.name.setText(list.get(position).get("name"));
holder.age.setText(list.get(position).get("age"));
holder.gender.setText(list.get(position).get("gender"));
holder.go_home.setTag(position);
holder.way.setTag(position);
return convertView;
}
class ViewHolder {
Spinner go_home;
EditText way;
TextView number;
TextView name;
TextView age;
TextView gender;
}
/**
* 下拉框点击事件,点击之后对输入框进行相应控制
*/
private class MyOnItemSelectListener implements AdapterView.OnItemSelectedListener {
private Spinner spinner;
private EditText editText;
public MyOnItemSelectListener(Spinner spinner, EditText editText) {
this.spinner = spinner;
this.editText = editText;
}
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
String num = ((Dict)spinner.getSelectedItem()).getDictCode();
if (num.equals("0")) {
editText.setHint("必填项不能为空");
editText.setEnabled(true);
editText.setText("");
} else {
editText.setHint("默认为空");
editText.setEnabled(false);
editText.setText("");
}
int index = (int) spinner.getTag();
((Activity5)context).saveSpinner(index, num);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
}
/**
* 监听输入框内容变化,并将输入内容传出
*/
private class MyTextChangListener implements TextWatcher {
private EditText editText;
public MyTextChangListener(EditText editText) {
this.editText = editText;
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
int index = (int) editText.getTag();
((Activity5)context).saveEditText(index, s.toString());
}
}
}
自定义ListView适配器EditSpinnerAdapter的布局文件list.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/number"
android:layout_width="80dp"
android:layout_height="match_parent"
android:gravity="center"
android:padding="3dp"
android:textSize="15sp"
android:background="@drawable/bg_border"/>
<TextView
android:id="@+id/name"
android:layout_width="100dp"
android:layout_height="match_parent"
android:gravity="center"
android:padding="3dp"
android:textSize="15sp"
android:background="@drawable/bg_border"/>
<TextView
android:id="@+id/age"
android:layout_width="60dp"
android:layout_height="match_parent"
android:gravity="center"
android:padding="3dp"
android:textSize="15sp"
android:background="@drawable/bg_border"/>
<TextView
android:id="@+id/gender"
android:layout_width="60dp"
android:layout_height="match_parent"
android:gravity="center"
android:padding="3dp"
android:textSize="15sp"
android:background="@drawable/bg_border"/>
<LinearLayout
android:layout_width="90dp"
android:layout_height="match_parent"
android:background="@drawable/bg_border">
<Spinner
android:id="@+id/go_home"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
<EditText
android:id="@+id/way"
android:layout_width="150dp"
android:layout_height="match_parent"
android:gravity="center"
android:padding="3dp"
android:textSize="15sp"
android:background="@drawable/bg_border"/>
</LinearLayout>
三:自定义下拉框适配器SpinnerArrayAdapter
package com.example.test.tools;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import com.example.test.R;
import com.example.test.entity.Dict;
import java.util.List;
public class SpinnerArrayAdapter extends BaseAdapter {
private Context context;
private List<Dict> list;
private LayoutInflater inflater;
public SpinnerArrayAdapter(Context context, List<Dict> list) {
this.context = context;
this.list = list;
this.inflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Text text = null;
if (convertView == null) {
text = new Text();
convertView = inflater.inflate(R.layout.spinner, null);
text.text_id = convertView.findViewById(R.id.text_id);
text.text_name = convertView.findViewById(R.id.text_name);
convertView.setTag(text);
} else {
text = (Text) convertView.getTag();
}
text.text_id.setText(list.get(position).getDictCode());
text.text_name.setText(list.get(position).getDictName());
return convertView;
}
class Text {
TextView text_id;
TextView text_name;
}
}
自定义下拉框适配器SpinnerArrayAdapter的布局文件spinner.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/text_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="3dp"
android:layout_marginLeft="10dp"/>
<TextView
android:id="@+id/text_id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="invisible"/>
</LinearLayout>
四:创建实体类Dict保存字典用于下拉框数据源
package com.example.test.entity;
public class Dict {
public String dictName;
public String dictCode;
public String getDictName() {
return dictName;
}
public void setDictName(String dictName) {
this.dictName = dictName;
}
public String getDictCode() {
return dictCode;
}
public void setDictCode(String dictCode) {
this.dictCode = dictCode;
}
}
五:调用
package com.example.test;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;
import com.example.test.entity.Dict;
import com.example.test.tools.EditSpinnerAdapter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Activity5 extends AppCompatActivity {
List<Map<String, String>> submit = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_5);
initView();
}
private void initView() {
Button btn = findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
/**
* 模拟list数据
*/
Map map1 = new HashMap();
map1.put("name", "张三");
map1.put("age", "18");
map1.put("gender", "男");
map1.put("number", "001");
submit.add(map1);
Map map2 = new HashMap();
map2.put("name", "翠花");
map2.put("age", "16");
map2.put("gender", "女");
map2.put("number", "002");
submit.add(map2);
Map map3 = new HashMap();
map3.put("name", "李四");
map3.put("age", "20");
map3.put("gender", "男");
map3.put("number", "003");
submit.add(map3);
Map map4 = new HashMap();
map4.put("name", "熊大");
map4.put("age", "32");
map4.put("gender", "男");
map4.put("number", "004");
submit.add(map4);
/**
* 模拟字典
*/
List<Map<String, String>> dicts = new ArrayList<>();
Map<String, String> map5 = new HashMap<>();
map5.put("dict_code", "0");
map5.put("dict_name", "是");
map5.put("tp_code", "go_home");
map5.put("cancel_status", "0");
dicts.add(map5);
Map<String, String> map6 = new HashMap<>();
map6.put("dict_code", "1");
map6.put("dict_name", "否");
map6.put("tp_code", "go_home");
map6.put("cancel_status", "0");
dicts.add(map6);
/**
* 获取字典并保存
*/
Map<String, List<Dict>> map_enable = new HashMap<>();
for (Map<String, String> m : dicts) {
List<Dict> lists = new ArrayList<>();
Dict dict = new Dict();
if (m.get("cancel_status").equals("0")) {
dict.setDictCode(m.get("dict_code"));
dict.setDictName(m.get("dict_name"));
if (map_enable.containsKey(m.get("tp_code"))) {
lists = map_enable.get(m.get("tp_code"));
lists.add(dict);
} else {
lists.add(dict);
}
map_enable.put(m.get("tp_code"), lists);
}
}
ListView listView = findViewById(R.id.list);
EditSpinnerAdapter adapter = new EditSpinnerAdapter(Activity5.this, submit, map_enable);
listView.setAdapter(adapter);
Button btn_submit = findViewById(R.id.btn_submit);
btn_submit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(Activity5.this, submit.toString(), Toast.LENGTH_LONG).show();
}
});
}
/**
* 获取下标值及下拉框的code
* @param i list下标值
* @param str 下拉框的code
*/
public void saveSpinner(int i, String str) {
String code = str;
submit.get(i).put("是否回家", code);
}
/**
* 获取下标值及输入框的内容
* @param i list下标值
* @param str 输入框内容
*/
public void saveEditText(int i, String str) {
String way = str;
submit.get(i).put("回家方式", way);
}
}
六:运行效果