0

このアダプタ要素(NotifyDataSetChanged)を使用すると、リストビューが更新されないため、少し混乱しています。

私の作業シナリオ:最初のiveはボイドを作成したので、リストビューのアイテムで何かを更新するたびに、ボイドを再度呼び出すことができます。

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」を呼び出すと、リストビューが更新されますが、予想どおり、リストビューの位置が再びゼロになることを再度バインドすることです。

それは以前の私の論理ですが、私が知ったように、アイテムの長いリストがある場合はどうなりますか?ユーザーは更新したいアイテムを見つけるためにもう一度下にスクロールする必要があるため、適切でユーザーフレンドリーではありません。

そのため、iveは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でアダプターを参照しなくなります。2つの選択肢があります。

  1. メソッドを呼び出しsetAdapter()ます。NotifyDataChangedOrderListSorted()

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

    しかし、これはと同じですbindOrderListSorted()

  2. 再利用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を使用する必要があります。これは、より高速で小さいためです...しかし、それはあなた次第です。

于 2013-01-03T01:58:10.323 に答える