listview中每一行动态生成输入框,下拉选择框等控件,
并设置监听,例如输入框设置每次输入完后都会保存输入值,下拉框每次选择后保存值,最后再汇总。我呢就是把值存在那个attrRespDtoList中的一个字段里,这样在再次渲染界面时,有值的情况下再默认显示这个值。
有三点值得注意:
一、下拉选择框异步加载数据,Spinner从服务器上解析数据,简单点说就是Spinner可见不可选,有两种解决方案,一则提前准备好数据,二则事先添加一个默认数据
Adapter = new ProductInfoAdapter(ProductInfoSet.this,R.layout.product_info_set_,attrRespDtoList,attrRespDtoListCopy);
productlistView.setAdapter(Adapter);
二、关于监听多个输入框,比如我这里监听输入框输入后的事件,是监听软键盘的隐藏事件,但是多个输入框的情况下,我们可能会保存每个输入框后的值,但是只会去监听一个输入框输入后的其他动作事件,可以写个全局变量,该特殊输入框的值赋给该全局变量,如果全局变量发生改变,那么触发该特殊的其他动作事件
因为如果在所有输入动作之后再想去获取值的话,可以明确,现在没有直接方法可以获得ListView中每一行的值.或许可以for循环去判断输入类型然后获取输入控件的值,但是这样很麻烦哦,我没这样做也不知道能不能做出来。
下面是我的业务实现逻辑代码:(有些地方还需要改动,改完再更新下)
@Override
public View getView(final int position , View convertView , ViewGroup parent) {
final ProduceAttrRespDto attrRespDtoListCopy = getItem(position);
final ProduceAttrRespDto productInfo = getItem(position);
ProductInfoAdapter.ViewHolder viewHolder;
if (convertView == null) {
convertView = LayoutInflater.from(getContext()).inflate(R.layout.product_info_add, null);
viewHolder = new ProductInfoAdapter.ViewHolder();
viewHolder.code =(TextView) convertView.findViewById(R.id.name);
viewHolder.linearLayout =(LinearLayout) convertView.findViewById(R.id.inputType);
convertView.setTag(viewHolder);
}else {
viewHolder = (ProductInfoAdapter.ViewHolder) convertView.getTag();
}
viewHolder.code.setText(productInfo.getAttrName());
LinearLayout.LayoutParams tvParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT, 1);
if (productInfo.getInputType().equals("input")) {
//设置textview垂直居中
tvParams.gravity = Gravity.CENTER;
final EditText editText = new EditText(getContext());
editText.setLayoutParams(tvParams);
editText.setHint("请输入"+productInfo.getAttrName());//显示名字
editText.setInputType(InputType.TYPE_CLASS_NUMBER);//输入类型
editText.setSingleLine(true); //下划线
editText.setImeOptions(IME_ACTION_DONE); //设置键盘完成
editText.setTextSize(16);
editText.addTextChangedListener(new TextWatcher() {
@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) {
//输入之后你想做什么 num[cout]=Integer.parseInt(editText.getText().toString());
String str = editText.getText().toString();
attrRespDtoListCopy.setCheckRule(str);
}
});
if (productInfo.getCheckRule()!=null){
editText.setText(productInfo.getCheckRule());
}
viewHolder.linearLayout.addView(editText);
if (productInfo.getAttrName().equals("工单号"))//增加查询按钮 设置监听 还要调取输入框的值
{
Button button =new Button(getContext());
button.setTextSize(12);
button.setText("查询工单");
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String string;
}
});
viewHolder.linearLayout.addView(button);
}
}else if (productInfo.getInputType().equals("selector")){
//伪造数据
List<String> data_list;
data_list = new ArrayList<String>();
data_list.add("1*6");
data_list.add("1*9");
data_list.add("1*12");
data_list.add("1*24");
data_list.add("1*24");
data_list.add("1*24");
final Spinner format = new Spinner(getContext());
ArrayAdapter<String> arr_adapter;
//适配器
arr_adapter= new ArrayAdapter<String>(getContext(), android.R.layout.simple_spinner_item, data_list);
//设置样式
arr_adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
//加载适配器
format.setAdapter(arr_adapter);
format.setLayoutParams(tvParams);
if (productInfo.getCheckRule()!=null){
format.setSelection(2,true); //设置下拉选择的默认值
}
format.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener(){
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
String form = (String) format.getSelectedItem();
attrRespDtoListCopy.setCheckRule(form);
}
@Override
public void onNothingSelected(AdapterView<?> adapterView) {
}
});
viewHolder.linearLayout.addView(format);
}
return convertView;
}
private class ViewHolder {
private TextView code;
private LinearLayout linearLayout;
}