大家好,菜鸡作者又来了,今天这篇文章,是分享下作者自己做过的一个需求,以免自己以后忘记。
话不多说,直接进入整题。
首先我们得先创建一个动态添加的item布局,代码如下:
然后再来看看主布局的代码:
布局文件写完后,接下来就是java代码了,动态添加addView的方法,
//动态添加一个item的方法
private void addItemView() {
mView = new View(MainActivity.this);
mView = View.inflate(this, R.layout.item_main, null);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.MATCH_PARENT);
mTextView1 = mView.findViewById(R.id.item_tv);
mEditText1 = mView.findViewById(R.id.item_et);
mTextView2 = mView.findViewById(R.id.item_tv1);
mEditText2 = mView.findViewById(R.id.item_et1);
mLinearLayout.addView(mView, params);
//给当前添加的View设置一个tag,这一步很重要。如果没有这个tag,我们后面无法取出view
mView.setTag(position);
//将tag和当前生成的view存入集合
mapView.put(position, mView);
//让tag自增一下,因为tag在这还承担着当前view序号的作用
position++;
mTextView1.setText("我是第" + position + "条" + "第1个TextView");
mTextView2.setText("我是第" + position + "条" + "第2个TextView");
//设置长按删除
setLongDelete();
}
在这个方法里,我们要做的就是通过和用户交互,动态的添加一条item,代码里的注释已经说的很详细了,(毕竟作者的文章就是给菜鸟新手程序猿看的,大神可以略过。。。)
长按删除当前item的方法
private void setLongDelete() {
mView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(final View view) {
new AlertDialog.Builder(MainActivity.this)
.setTitle("提示")
.setMessage("确定要删除吗?")
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//根据点击的当前View,获取上面存储的tag,这个view就是onLongClick(View view)里的这个view,直接拿来用,他可以判断出当前点击的哪一个view
int positionView = (int) view.getTag();
//通过map集合把刚获得的tag放进去,从而获取到当前要删除的view
mLinearLayout.removeView(mapView.get(positionView));
//移除掉这个tag
mapView.remove(positionView);
//当map集合删除掉最后一条时,会初始化tag和view
if (mapView.size() == 0) {
position = 0;
editText.clear();
mLinearLayout.removeAllViews();
}
Toast.makeText(getApplicationContext(), "删除成功", Toast.LENGTH_LONG).show();
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
return;
}
}).show();
return false;
}
});
}
其中这个方法中,作者认为较为不好理解的就是 int positionView = (int) view.getTag();这句代码,因为水平太菜,当初这里想不通,作者也是看了下这里的源码才理解的,(大家可以看看源码,有助于理解)这句代码只要大家理解了,以后再做类似的功能就是手到擒来了。
接下来就是要获取用户给添加的item中EditText输入的值的问题了。
这个问题也很简单,大家只要搞清楚布局.getChildCount()
这个方法就行了,其中布局可以是任意的布局,线性,相对,帧。他的方法的意思就是获取当前布局内有多少个一级子布局,(只能获取它自身的子布局,并不能获取它子布局的子布局),一句话,他只能知道他有多少个儿子,但是却不能知道他儿子有几个儿子(当爷爷的不能知道孙子有几个。。。)代码如下:
private boolean getEditItem() {
//getChildCount()此方法可以获取到当前的linearLayout里含有多少个view
for (int i = 0; i < mLinearLayout.getChildCount(); i++) {
//将每一个view遍历出来,然后findViewById后,就可以获取EditText的值
View childAtView = mLinearLayout.getChildAt(i);
mEditText1 = childAtView.findViewById(R.id.item_et);
mEditText2 = childAtView.findViewById(R.id.item_et1);
if (!mEditText1.getText().toString().equals("") && !mEditText2.getText().toString().equals("")) {
editText.add(mEditText1.getText().toString());
editText.add(mEditText2.getText().toString());
} else {
Toast.makeText(this, "第" + (i + 1) + "个item的EditText没有完整填写", Toast.LENGTH_SHORT).show();
return false;
}
}
return true;
}
此处我用的是一个boolean类型的返回值,项目后面会用到,不想要的同学,把boolean改掉就行了。好了这个项目就算完结了。下次再见。
本文源码地址:https://github.com/reverseAndroid/simple-addView