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

时间:2019-03-26 05:33:45

标签: android sqlite listview android-cursor

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

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

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

  • display_contacts1.invalidateViews();

  • arrayAdapter.notifyDataSetChanged();

  • manageListView(getContext());

但是我仍然没有运气找到解决方案。 listview更新的唯一方法是进入另一个片段或重新启动应用程序。

原始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();
    }
}

1 个答案:

答案 0 :(得分:0)

将值插入数据库后,您仍然可以调用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();