在(android listview ExpandableListView实现多选,单选,全选,edittext实现批量输入,http://blog.csdn.net/wangwo1991/article/details/52084287)这篇博客中写到了edittext的批量输入的实现,这篇博客里面是采用listview+edittext的方式实现的,比较容易实现,但是在处理edittext的焦点错位和数据复用上面很蛋疼,效果不是很好,最终在项目中采用了scrollview+edittext的方式实现了该效果;
scrollview+edittext方式实现的效果:
比listview+edittext实现的效果要理想,并没有出现edittext的焦点错位和数据复用,细看效果,需要根据数据去动态的创建一个RelativeLayout,一个LinearLayout(里面包含一个TextView,三个EditText),及一个view(分割线),并根据对应的关系添加到布局中;
1、动态创建布局
/**
* 创建新的布局并添加到goalLayout布局中
*/
private void createEdit() {
int size = list.size();
//遍历数据,根据数据的多少动态创建布局
for (int i = 0; i < size; i++) {
DataInfo info = list.get(i);
//创建一个RelativeLayout
RelativeLayout rl = new RelativeLayout(MainActivity.this);
//设置背景色
rl.setBackgroundColor(getResources().getColor(R.color.white));
//创建LinearLayout
LinearLayout ll = new LinearLayout(MainActivity.this);
//设置LinearLayout的方向
ll.setOrientation(LinearLayout.HORIZONTAL);// 横向
//动态创建TextView
TextView tv = new TextView(MainActivity.this);
//设置TextView居中显示
tv.setGravity(Gravity.CENTER);
//设置TextView的大小
tv.setTextSize(TypedValue.COMPLEX_UNIT_PX, sp2px(this, 13f));
tv.setTextColor(getResources().getColor(R.color.black));
tv.setText("" + info.valueFirst);
//设置TextView的宽高LinearLayout中
tv.setLayoutParams(new LinearLayout.LayoutParams(sp2px(this, 70), LinearLayout.LayoutParams.WRAP_CONTENT));
//将创建的TextView添加到
ll.addView(tv);
//创建第一个edittext
createEt(ll, info.valueSecond, 1, info);
//创建第二个edittext
createEt(ll, info.valueThird, 2, info);
//创建第三个edittext
createEt(ll, info.valueFour, 3, info);
RelativeLayout.LayoutParams llparams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,
RelativeLayout.LayoutParams.WRAP_CONTENT);
llparams.addRule(RelativeLayout.CENTER_VERTICAL, RelativeLayout.TRUE);
ll.setLayoutParams(llparams);
//将ll添加到RelativeLayout布局中
rl.addView(ll);
// 动态添加底部线条
View v = new View(MainActivity.this);
RelativeLayout.LayoutParams rlparams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, sp2px(this, 0.5f));
rlparams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE);
v.setBackgroundColor(getResources().getColor(R.color.list_item_line_color));
v.setLayoutParams(rlparams);
rl.addView(v);
//设置整个条目的宽高
rl.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, sp2px(this, 40f)));
//将rl添加到goalLayout中
goalLayout.addView(rl);
}
}
2、动态创建edittext
/**
* 动态创建editext
* @param ll 将editext添加到的布局
* @param num 给editext设置的值
* @param type 用于标识操作对应的editext
* @param info 数据模型对象
*/
private void createEt(LinearLayout ll, String num, final int type, final DataInfo info) {
//动态创建EditText
final EditText et1 = new EditText(MainActivity.this);
//设置EditText的字体大小
et1.setTextSize(TypedValue.COMPLEX_UNIT_PX, sp2px(this, 13f));
//设置EditText inputtype类型
et1.setInputType(InputType.TYPE_CLASS_NUMBER);
// 设置可输入长度
et1.setFilters(new InputFilter[]{new InputFilter.LengthFilter(5)});
et1.setTextColor(getResources().getColor(R.color.black));
//设置padding
et1.setPadding(sp2px(this, 8f), 0, 0, 0);
et1.setGravity(Gravity.CENTER_VERTICAL);
//设置背景
et1.setBackgroundResource(R.drawable.bg_edittext_normal);
et1.setText(num);
//监听输入
et1.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void afterTextChanged(Editable s) {
}
});
LinearLayout.LayoutParams llp = new LinearLayout.LayoutParams(etW, sp2px(this, 30));
llp.leftMargin = dip2px(this, 10);
llp.rightMargin = dip2px(this, 10);
et1.setLayoutParams(llp);
//将创建的EditText添加到LinearLayout布局中
ll.addView(et1);
}
在动态创建edittext的时候需要根据屏幕的分比率计算每个edittext的宽度;
2.1、计算每个edittext的宽度
//获取屏幕的宽度
w = getW(MainActivity.this);
//计算每个Edittext的宽度
etW = (w - dip2px(this, 130)) / 3;
很简单,这样效果就实现了。
源码地址:
http://download.csdn.net/download/wangwo1991/9929793
关联播客:
android listview ExpandableListView实现多选,单选,全选,edittext实现批量输入
http://blog.csdn.net/wangwo1991/article/details/52084287