Listview动态增加与删除控件条目,条目内容可编辑,实现如下效果:
1、按+则增加控件条目,按x删除控件条目
2、编辑内容可保存,如下所示:
从网上找到一些代码不能用或有缺陷,现在将代码整理OK如下;
MainActivity代码(比较简单):
package com.example.listviewasitem; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import android.widget.ListView; import android.widget.Toast; public class MainActivity extends Activity { private ListView myList; // ListView控件 private AddNumberBaseAdpater addNumberBaseAdpater; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); addNumberBaseAdpater=new AddNumberBaseAdpater(getApplicationContext()); myList = (ListView) findViewById(R.id.listview1); myList.setAdapter(addNumberBaseAdpater); } } AddNumberBaseAdpater代码: package com.example.listviewasitem; import java.util.ArrayList; import android.content.Context; import android.text.Editable; import android.text.Selection; import android.text.SpannableStringBuilder; import android.text.TextWatcher; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.EditText; import android.widget.ImageButton; import android.widget.TextView; public class AddNumberBaseAdpater extends BaseAdapter { private LayoutInflater mInflater; private ArrayList<String> text; int tindex = 0; String temp; int sp; public AddNumberBaseAdpater(Context context) { text = new ArrayList<String>(); text.add("第1个自定义控件条目");// 默认只加载1个Item this.mInflater = LayoutInflater.from(context); } public int getCount() { // TODO Auto-generated method stub return text.size(); } public Object getItem(int position) { return text.get(position); } public long getItemId(int position) { // TODO Auto-generated method stub return position; } public View getView(final int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub // final ViewHolder holder = new ViewHolder(); final ViewHolder holder;// 新建holder一定要放在if内 if (convertView == null) { holder = new ViewHolder();// 新建holder一定要放在if内 convertView = mInflater.inflate(R.layout.addnumber, null); holder.btnOpen = (ImageButton) convertView .findViewById(R.id.ibtnAddNumber); holder.editText = (EditText) convertView .findViewById(R.id.editNumber); convertView.setTag(holder); } else { // Log.d("getView","getView called convertView !== null "); holder = (ViewHolder) convertView.getTag(); } // switch (position) {// 不要以为XML文件中是2个按钮,其实只有一个 case 0: holder.btnOpen .setBackgroundResource(android.R.drawable.ic_input_add);// 第一项按钮则显示加号图片 // holder.editText.setText(text.get(tindex)); break; default: holder.btnOpen.setBackgroundResource(android.R.drawable.ic_delete);// 超过了一项则显示减号图片,可以删除 break; } holder.editText.setText(text.get(position)); holder.ref = position; // // //添加EditText文本输入并保存到text. holder.editText .setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { // TODO Auto-generated method stub holder.editText.getText(); text.remove(position); text.add(position, holder.editText.getText().toString()); } }); holder.btnOpen.setOnClickListener(new View.OnClickListener() {// 添加按钮 public void onClick(View v) { if (position == 0) { // text.add("xxx");// 添加一项控件 tindex = tindex + 1; text.add("第" + String.valueOf(tindex + 1) + "自定义控件条目:");// 添加一项控件 } else if (position > 0) {// 始终留一项不能删除 text.remove(position);// 删除选定按钮 // text.remove(text.size() - 1);// 删除最后一个按钮 tindex = tindex - 1; } notifyDataSetChanged(); } }); return convertView; } private class ViewHolder { public EditText editText; public ImageButton btnOpen; int ref; } } 布局文件比较简单,就不传了。原代码下载地址:http://download.csdn.net/detail/xiaozenbin/9747532