即使使用 Sql 数据库和游标调用 notifyDataSetChanged(),Listview 也不会自动更新

Posted

技术标签:

【中文标题】即使使用 Sql 数据库和游标调用 notifyDataSetChanged(),Listview 也不会自动更新【英文标题】:Listview not updating automatically even with notifyDataSetChanged() called with Sql database and Cursor 【发布时间】:2019-08-16 10:34:12 【问题描述】:

我正在使用一个函数从 android 电话簿中选择电话名称,并使用光标来获取联系人的姓名和号码。我能够成功地做到这一点,并将值插入到我在此处另一个问题的帮助下编写的 sqllite 数据库中,但是当向数据库中插入新值时,listview 不会自动更新。

我已经使用了所有需要的行,包括

((BaseAdapter)display_contacts1.getAdapter()).notifyDataSetChanged();

display_contacts1.invalidateViews();

arrayAdapter.notifyDataSetChanged();

manageListView(getContext());

但我仍然无法找到解决方案。列表视图更新的唯一方法是进入不同的片段或重新启动应用程序。

原始 SQL 数据库代码 Android OnItemClick not working with loaded SQL Database into listview

SelectModemFragment.java

//--------------------------------------------------------------------
// Select Phone number from Contacts list
//--------------------------------------------------------------------
@Override
public void onActivityResult(int reqCode, int resultCode, Intent data)

    if (resultCode == RESULT_OK)
    
        // Check for the request code
        switch (reqCode)
        
            case CONTACT_PICKER:
                contactPicked(data);
                break;
        
    
    else
    
        Log.e("MainActiivity", "Failed to pick contact");
    




private void contactPicked(Intent data)

    //Cursor cursor = null;
    try
    
        // getData() method will have the Content Uri of the selected contact
        Uri uri = data.getData();

        //Query the content uri
        cursor = getActivity().getApplicationContext().getContentResolver().query(uri, null, null, null, null);
        cursor.moveToFirst();

        // column index of the contact name
        int  nameIndex =cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME);

        // column index of the phone number
        int  phoneIndex =cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);

        name = cursor.getString(nameIndex);
        phoneNo = cursor.getString(phoneIndex);

        // Show message displaying the contact selected from the phonebook
        Toast.makeText(getContext(),name, Toast.LENGTH_SHORT).show();
        Toast.makeText(getContext(), phoneNo, Toast.LENGTH_SHORT).show();

        // Insert values to sqlite database
        dbHelper.insert(name, phoneNo);

        // Need to immediately update the listview one the values have been inserted into the database
        ((BaseAdapter)display_contacts1.getAdapter()).notifyDataSetChanged();

        //display_contacts1.invalidateViews(); // This isn't working
        //arrayAdapter.notifyDataSetChanged(); // This isn't working
        //manageListView(getContext());, this didn't work
    
    catch (Exception e)
    
        e.printStackTrace();
    

【问题讨论】:

我把行 thelist = dbHelper.getAllRowsAsList();和 ((BaseAdapter)display_contacts1.getAdapter()).notifyDataSetChanged();将值插入数据库后但仍未自动更新列表视图 【参考方案1】:

将值插入数据库后,您仍然可以调用 notifyDataSetChanged(),然后再次打开片段

 // Need to immediately update the listview one the values have been inserted into the database
            ((BaseAdapter)display_contacts1.getAdapter()).notifyDataSetChanged();

            // Reopen the fragment
            getFragmentManager().beginTransaction().replace(R.id.frame_layout, SelectModemFragment.newInstance()).commit();

【讨论】:

以上是关于即使使用 Sql 数据库和游标调用 notifyDataSetChanged(),Listview 也不会自动更新的主要内容,如果未能解决你的问题,请参考以下文章

Oracle笔记4-pl/sql-分支/循环/游标/异常/存储/调用/触发器

为啥人们如此讨厌 SQL 游标? [关闭]

SQL Server游标

ucanaccess SQL 异常:游标状态无效:已识别游标未打开

在没有游标的 SQL 中展平 SQL 分层数据结构

如何优化使用游标的 PL/SQL 代码