【发布时间】:2014-08-20 13:56:48
【问题描述】:
我有一个 ListView 小部件(位于其他 UI 元素下方),它是不扩展 ListActivity 的 Activity 的一部分。我正在尝试编写一个基本功能,在单击Button 时向ListView 添加额外的项目。此数据来自EditText。我为onCreate() 中的ListView 定义Adapter,在我的情况下为ArrayAdapter,并使用setListAdapter() 为ListView 设置适配器。但是,当我尝试向ListView 添加一个额外的项目时,会添加两个项目来代替一个(一个项目及其副本)。下面有更多详细信息。
响应Button点击并在调用notifyDataSetChanged()之前尝试添加额外元素的函数如下:
public void saveButton(View view){
EditText editText = (EditText) findViewById(R.id.edit_text);
String data = editText.getText().toString();
// duplication caused by this line
b.add(data);
ArrayAdapter adapter = (ArrayAdapter) listView.getAdapter();
adapter.add((String)data);
adapter.notifyDataSetChanged();
}
当我不包括这一行时:
b.add(数据);
将单个项目添加到列表中,这是预期的行为,因为adapter.add(Object) 将额外的项目附加到列表中。然而更奇怪的是,当我不包含 adapter.add(Object) 时,列表中仍会呈现一个列表项。
public void saveButton(View view){
EditText editText = (EditText) findViewById(R.id.edit_text);
String data = editText.getText().toString();
b.add(data);
ArrayAdapter adapter = (ArrayAdapter) listView.getAdapter();
// not calling adapter.add() still includes an item in the list.
// adapter.add((String)data);
adapter.notifyDataSetChanged();
}
经过一番调试我发现这是由于在ArrayList中添加了一个数据项,即b.add(data),其中b是字符串的ArrayList,导致一个项目包含在ListView 尽管没有调用 adapter.add(Object)`。
第一季度。为什么会这样?
第二季度。作为扩展,这是否意味着ArrayList 与我的ArrayAdapter“耦合”(因为它是使用 ArrayList 作为参数构造的),这意味着我不需要调用像 add() 或 clear() 这样的适配器方法操纵我的ListView ?
这也是我的 Activity 的完整代码:
public class MainActivity extends Activity {
ListView listView;
ArrayList<String> b = new ArrayList<String>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
b.add("Liquorice");
b.add("Dairy Milk");
b.add("Rice Crispies");
b.add("Orange-Mint");
b.add("After-Tens");
listView = (ListView) findViewById(R.id.list_view);
ArrayAdapter adapter = new ArrayAdapter<String>(getApplicationContext(),R.layout.layout_file,b);
listView.setAdapter(adapter);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
public void saveButton(View view){
EditText editText = (EditText) findViewById(R.id.edit_text);
String data = editText.getText().toString();
b.add(data);
ArrayAdapter adapter = (ArrayAdapter) listView.getAdapter();
adapter.add((String)data);
adapter.notifyDataSetChanged();
}
}
我还浏览了其他 SO 帖子,但他们没有给我想要的答案。
ArrayAdapter in android to create simple listview
Why can't one add/remove items from an ArrayAdapter?
Duplicated entries in ListView
对此的任何方向或解释将不胜感激。也非常感谢您抽出宝贵的时间。
【问题讨论】:
-
代码中的“b”是什么?
-
b 是一个字符串数组列表,其中包含我要在屏幕上呈现的数据。这也包含在问题中。
-
从您的代码中删除这两行 ArrayAdapter adapter = (ArrayAdapter) listView.getAdapter();适配器.add((String)data);.
标签: android android-listview android-arrayadapter android-adapter