当我尝试将数据从SQLite数据库加载到我的ListView
时,每个项目都是重复的。
我在访问Cursor
时双重检查了我的数据库值:其中没有冗余数据。但是当我尝试在ListView
中显示时,我会得到重复的条目。我尝试了本节中的其他问题,但没有什么能解决我的问题。我知道哈希集可以减少冗余数据。但我不知道如何使用它。
这是我的代码:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.distance);
list = (ListView) findViewById(R.id.list);
openAndQueryDatabase();
displayResultList();
}
private void displayResultList() {
String[] fromwhere = { "code","name" };
int[] viewswhere = { R.id.id,R.id.name};
ADAhere = new SimpleAdapter(Distance.this, datas,
R.layout.simple_list_row, fromwhere, viewswhere);
list.setAdapter(ADAhere);
list.setOnItemClickListener(this);
}
private void openAndQueryDatabase() {
try {
datas = new ArrayList<Map<String, String>>();
DatabaseHelper dbHelper = new DatabaseHelper(this.getApplicationContext());
newDB = dbHelper.getWritableDatabase();
Cursor c = newDB.rawQuery("select distinct cust_code,cust_name from customer", null);
Log.v("detailss", c.toString());
while (c.moveToNext()){
HashMap<String, String> datanums = new HashMap<String, String>();
String custcode = c.getString(c.getColumnIndex("cust_code"));
datanums.put("code", custcode);
datas.add(datanums);
String name = c.getString(c.getColumnIndex("cust_name"));
datanums.put("name", name);
datas.add(datanums);
}
}
catch (SQLiteException se ) {
Log.e(getClass().getSimpleName(), "Could not create or Open the database");
}
}
答案 0 :(得分:2)
让我们来看看您如何从Cursor
&#39; c&#39;到ArrayList<Map<String, String>>
&#39;数据&#39;:
while (c.moveToNext()){ HashMap<String, String> datanums = new HashMap<String, String>(); String custcode = c.getString(c.getColumnIndex("cust_code")); datanums.put("code", custcode); datas.add(datanums); String name = c.getString(c.getColumnIndex("cust_name")); datanums.put("name", name); datas.add(datanums); }
每个Cursor
位置属于一个数据库表行。 (如果我们将查询结果视为非常短暂的表,对于使用JOIN等的查询,这甚至是正确的。)
在您的代码中,我们看到每行都会在Map
的两个位置添加ArrayList
。
首先,您将(&#34;代码&#34;,custcode)放入Map
&#39;数据库&#39;并将其添加到List
。
然后你把(&#34;名称&#34;,名称)放到同一个对象,即&#39; datanums&#39;。 这意味着您更改了列表中已包含的对象。
您可以再次将此对象添加到List
。现在List
具有成对的相同元素,ListView
显示重复的条目。
每行只需要一个List
元素,因此请删除其中一个datas.add(datanums);
语句。