0

我对这个适配器元素(NotifyDataSetChanged)有点困惑,因为当我使用它时,我的列表视图没有更新。

我的工作场景:首先我创建了一个 void,这样每当我更新 listview 项目上的某些内容时,我就可以再次调用我的 void。

private void bindOrderListSorted(String sort){
    orderList = new ArrayList<Order>();
    mySQLiteAdapter = new SQLiteAdapter(context);
    mySQLiteAdapter.openToRead();
    String selectQuery = "MY QUERY...";
    Cursor cursor =mySQLiteAdapter.read(selectQuery); 
    while(cursor.moveToNext())
    {
        Order order = new Order();
        order.orderdDesc = cursor.getString(0);
        order.orderitemCode = cursor.getString(1);
        order.orderitemID = cursor.getString(2);
        order.orderPrice = cursor.getString(3);
        order.qtyOrdered = cursor.getString(4);
        order.stocksQty = cursor.getString(5);
        orderList.add(order);
    }
    cursor.close();
    mySQLiteAdapter.close();
    orderAdapter =new OrderListAdapter(this, orderList,context, sort);      
    listViewSearchPanel.setAdapter(orderAdapter);

}

关于这个的主要问题是,每当我更新我的数据库中的某些内容并调用“bindOrderListSorted”时,我的列表视图都会更新,但正如预期的那样,它会再次重新绑定,列表视图的位置再次变为零。

那是我之前的逻辑,但后来我发现,如果我有很长的项目清单怎么办?这将不适合和用户友好,因为用户必须再次向下滚动才能找到他/她希望更新的项目

所以我了解了 NotifyDataSetChanged 并为此再次创建了一个 void

private void NotifyDataChangedOrderListSorted(String sort){
    orderList = new ArrayList<Order>();
    mySQLiteAdapter = new SQLiteAdapter(context);
    mySQLiteAdapter.openToRead();
    String selectQuery = "MY QUERY... SAME AS BEFORE";
    Cursor cursor =mySQLiteAdapter.read(selectQuery); 
    while(cursor.moveToNext())
    {
        Order order = new Order();
        order.orderdDesc = cursor.getString(0);
        order.orderitemCode = cursor.getString(1);
        order.orderitemID = cursor.getString(2);
        order.orderPrice = cursor.getString(3);
        order.qtyOrdered = cursor.getString(4);
        order.stocksQty = cursor.getString(5);
        orderList.add(order);
    }

    cursor.close();
    mySQLiteAdapter.close();
    orderAdapter =new OrderListAdapter(this, orderList,context, sort);  
    orderAdapter.notifyDataSetChanged();

}

并在我更新某些内容时调用“NotifyDataChangedOrderListSorted”。

我的主要问题是我的列表视图没有更新。我很确定我的 orderList 具有更新的值,因为使用调试器和断点我期望的数据是预期的。这是为什么?

请随时提出建议或意见。如果您想查看我的基本适配器,请这样说..

提前致谢

4

1 回答 1

2

您正在创建一个新的 List 和 ArrayAdapter,因此notifyDataSetChanged()没有效果,并且orderAdapter不再引用 ListView 中的适配器。你有两个选择:

  1. 调用setAdapter()你的NotifyDataChangedOrderListSorted()方法:

    ...
    orderAdapter =new OrderListAdapter(this, orderList,context, sort);  
    listViewSearchPanel.setAdapter(orderAdapter);
    

    但这等同于bindOrderListSorted()

  2. 重用orderListorderAdapter

    private void NotifyDataChangedOrderListSorted(String sort){
        orderList.clear(); // Change this
        mySQLiteAdapter = new SQLiteAdapter(context);
        mySQLiteAdapter.openToRead();
    
        ...
        cursor.close();
        mySQLiteAdapter.close();
        orderAdapter.notifyDataSetChanged(); // Change this
    
    }
    

实际上你应该使用 CursorAdapter 因为它们更快更小......但这取决于你。

于 2013-01-03T01:58:10.323 回答