我对这个适配器元素(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有更新的值因为使用调试器和断点我期待的数据是预期的。那是为什么?
请随时推荐建议或意见。如果你想看到我的基础适配器请说出来..
感谢提前
答案 0 :(得分:2)
您正在创建一个新的List和ArrayAdapter,因此notifyDataSetChanged()
无效,orderAdapter
不再引用ListView中的适配器。你有两个选择:
在setAdapter()
方法中致电NotifyDataChangedOrderListSorted()
:
...
orderAdapter =new OrderListAdapter(this, orderList,context, sort);
listViewSearchPanel.setAdapter(orderAdapter);
但这与bindOrderListSorted()
重复使用orderList
和orderAdapter
:
private void NotifyDataChangedOrderListSorted(String sort){
orderList.clear(); // Change this
mySQLiteAdapter = new SQLiteAdapter(context);
mySQLiteAdapter.openToRead();
...
cursor.close();
mySQLiteAdapter.close();
orderAdapter.notifyDataSetChanged(); // Change this
}
但真的你应该使用CursorAdapter,因为它们更快更小......但这取决于你。