在此示例代码中,用户使用ArrayAdapter的add(T obj)添加简单的文本字符串。
ListView myList = findViewById(R.id.list_view);
final ArrayAdapter<String> listAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1);
myList.setAdapter(listAdapter);
Button button = findViewById(R.id.button);
button.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v){
String val = "abc"; //just as an example
listAdapter.add(val);
}
}
);
该字符串值应该来自编辑文本。
问题是,什么时候/为什么我们应该直接向ArrayAdapter添加对象,而不是修改datasource(ArrayList)然后调用listAdapter.notifyDataSetChanged()
当我们必须直接使用arrayadapter时会出现实际用例吗?
答案 0 :(得分:0)
何时/为什么应该将对象直接添加到ArrayAdapter中 修改数据源(ArrayList)然后调用 listAdapter.notifyDataSetChanged()
有两种方法可以将项目添加到ListView。
datasource.add(item);
listview.notifyDataSetChanged();
或
adapter.add(item);
实际上,第二个实现与第一个相同,但在底层进行了一些额外的检查,这是add
中的ArrayAdapter
方法定义。
/**
* Adds the specified object at the end of the array.
*
* @param object The object to add at the end of the array.
* @throws UnsupportedOperationException if the underlying data collection is immutable
*/
public void add(@Nullable T object) {
synchronized (mLock) {
if (mOriginalValues != null) {
mOriginalValues.add(object);
} else {
mObjects.add(object);
}
mObjectsFromResources = false;
}
if (mNotifyOnChange) notifyDataSetChanged();
}
mObjects
引用了datasource
变量,因此它们是相同的。
哪个更好?
两者之间有些许相同,存在一种情况,如果您在程序中的某个位置调用datasource.add(item)
而忘记调用listview.notifyDataSetChanged
,则您的列表视图将不会更新。为避免这种情况,您应该使用adapter.add(item);
,因为它会自动更新列表视图。