Listview显示执行时的重复值

时间:2016-03-04 11:13:59

标签: android sqlite listview

当我尝试将数据从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");
    } 

}

1 个答案:

答案 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);语句。