揭秘在ListView等AdapterView上动态添加删除项的陷阱

2019-12-10 18:17:33王振洲


  通过源码可以发现,我上面的思考还是有误的。ArrayAdapter并没有单独维护array类型的数据,而是统一转换成了List,并存在了mObjects对象中。    

  createFromResource(...)调用了ArrayAdapter(Context context, int textViewResourceId, T[] objects)构造方法,而在该方法的内部实现中,android使用Arrays的静态方法asList(...)将一个数组转换为List。熟悉Java的程序员都知道,Arrays.asList(...)方法所返回的并不是一个java.util.ArrayList,而是一个Arrays类的内部类,该List实现是不能进行增删操作的!!(见jdk文档),对该List进行add将抛出UnsupportedOperationException!

  哈哈,这下终于真相大白了,这样一来稍微改动一下原来的代码即可成功运行:D
FInal Solution:

/**
 * 
 * @author CodingMyWorld
 * 2011-7-31 下午04:43:48
 */
public class MyListView extends ListActivity {
 private ArrayAdapter<CharSequence> mAdapter;
 private ListView mListView;
 private EditText mLanguageText;
 private Button mAddButton;
 
 /** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.mylist1);
 
 //get the view
 mListView = getListView();
 mLanguageText = (EditText) findViewById(R.id.addLangEdit);
 mAddButton = (Button) findViewById(R.id.addButton);
 
 //array adapter created from string array resources
 List<CharSequence> objects = new ArrayList<CharSequence>(
  Arrays.asList(getResources().getTextArray(R.array.language)));
 mAdapter = new ArrayAdapter<CharSequence>(
  this, 
  android.R.layout.simple_list_item_1, 
  objects);
 //set the adapter
 mListView.setAdapter(mAdapter);
 
 //add listener
 mAddButton.setOnClickListener(mOnClickListener);
 }
 
 private OnClickListener mOnClickListener = new View.OnClickListener() {
 @Override
 public void onClick(View v) {
  String text = mLanguageText.getText().toString();
  if(null == text || "".equals(text.trim())) {
  Toast.makeText(MyListView.this, "输入不能为空", Toast.LENGTH_SHORT).show();
  }else {
  mAdapter.add(text);
  mAdapter.notifyDataSetChanged(); //not required 
  mLanguageText.setText("");
  }
 }
 };
}

以上就是关于Android Listview相关内容介绍,希望对大家的学习有所帮助。



注:相关教程知识阅读请移步到Android开发频道。