我们什么时候应该将项目直接添加到ArrayAdapter?

时间:2019-03-05 14:12:18

标签: android android-listview android-arrayadapter

在此示例代码中,用户使用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时会出现实际用例吗?

1 个答案:

答案 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);,因为它会自动更新列表视图。