Android NotifyDataSetChanged和BaseAdapter

时间:2013-01-03 01:42:08

标签: java android listview baseadapter

我对这个适配器元素(NotifyDataSetChanged)有点困惑,因为当我使用它时,我的listview不会更新。

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

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”时,我的listview会更新,但正如预期的那样,它会再次重新绑定listview的位置再次变为零。

之前是我的逻辑但是当我发现时,如果我有很长的项目列表怎么办?它不合适且用户友好,因为用户必须再次向下滚动才能找到他/她希望更新的项目

所以我已经了解了NotifyDataSetChanged并为此再次创建了一个空白

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”。

我的主要问题是我的listview没有更新。我很确定我的orderList有更新的值因为使用调试器和断点我期待的数据是预期的。那是为什么?

请随时推荐建议或意见。如果你想看到我的基础适配器请说出来..

感谢提前

1 个答案:

答案 0 :(得分:2)

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

  1. setAdapter()方法中致电NotifyDataChangedOrderListSorted()

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

    但这与bindOrderListSorted()

  2. 相同
  3. 重复使用orderListorderAdapter

    private void NotifyDataChangedOrderListSorted(String sort){
        orderList.clear(); // Change this
        mySQLiteAdapter = new SQLiteAdapter(context);
        mySQLiteAdapter.openToRead();
    
        ...
        cursor.close();
        mySQLiteAdapter.close();
        orderAdapter.notifyDataSetChanged(); // Change this
    
    }
    
  4. 真的你应该使用CursorAdapter,因为它们更快更小......但这取决于你。