2016-03-04 107 views
0

当我尝试从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

每个数据库行(=一对代码和名称)真的有两个相同的行吗? – 0X0nosugar

+0

@ 0X0nosugar在数据库中不存在重复的值。 – Bivin

回答

2

让我们来看看如何从Cursor 'C' 到ArrayList<Map<String, String>> '数据' 的数据传输:

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等查询甚至真)

在你的代码中,我们看到,对于每一行,你在两个地方添加MapArrayList

  • 首先,你把( “代码”,custcode)到Map 'datanums',并把它添加到List

  • 然后你把(“姓名”,姓名)放到相同的对象,即'datanums'。 这意味着您更改了列表中已包含的对象。

  • 将此对象第二次添加到List。现在List具有相同的元素对,并且ListView显示重复的条目。

你需要每行只有一个List元素,因此降datas.add(datanums);语句之一。

+1

非常感谢你..它清除了我的问题。并感谢详细的描述,这将帮助我在处理地图时记住它。:) – Bivin