将 SQLite 表数据显示到列表视图中,就在将数据插入同一 Activity 上的表之后,无需关闭 Activity 并重新打开

Posted

技术标签:

【中文标题】将 SQLite 表数据显示到列表视图中,就在将数据插入同一 Activity 上的表之后,无需关闭 Activity 并重新打开【英文标题】:Show SQLite table data into listview Just after the data inserted into table on same Activity without closing the activity and reopen 【发布时间】:2019-11-23 08:35:09 【问题描述】:

我正在读取电话联系人并将其存储到 SQLite 表中,它工作正常,但是当我尝试将 SQLite 表中相同活动的联系人显示到列表视图中时,我需要关闭并重新打开活动以查看 SQLite 中的联系人列表表。我怎样才能一次做到这一点,请提供解决方案。在此先感谢。

public class ContactsActivity extends AppCompatActivity 
    private DataBaseHelper db;
    private ListView listView;
    private ProgressBar progressBar;
    private List<String> namelist=null;
    private Button btnLoad;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_contacts);
        listView = findViewById(R.id.listView);
        progressBar = findViewById(R.id.progressBar);
        btnLoad = findViewById(R.id.btnLoad);
        db=new DataBaseHelper(ContactsActivity.this);
        namelist = db.getData();

        if(namelist.size()>0)
        
            ArrayAdapter listadapter = new ArrayAdapter<>(getApplication(),android.R.layout.simple_list_item_1,namelist);
            listView.setAdapter(listadapter);
        
        else
            AsyncTask.execute(() -> getcontacts());

        

    
    public void getcontacts()
    
            progressBar.setVisibility(View.VISIBLE);
            db=new DataBaseHelper(ContactsActivity.this);
            ContentResolver cr = getContentResolver();
            Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI,
                    null, null, null, null);
            assert cur != null;
            if (cur.getCount() > 0) 
                while (cur.moveToNext()) 
                    String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
                    if (Integer.parseInt(cur.getString(
                            cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) 
                        Cursor pCur = cr.query(
                                ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                                null,
                                ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?",
                                new String[]id, null);
                        assert pCur != null;
                        while (pCur.moveToNext()) 
                            String phoneNo = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                            String Name = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
                            db.insert(Name,phoneNo);

                        
                        pCur.close();
                    
                
                progressBar.setVisibility(View.GONE);

                        namelist = db.getData();
                        ArrayAdapter listadapter = new ArrayAdapter<>(getApplication(),android.R.layout.simple_list_item_1,namelist);
                        listadapter.notifyDataSetChanged();
                        listView.setAdapter(listadapter);


                cur.close();
            
    


数据已成功插入 SQLite 表,但列表视图在关闭并重新打开活动后填充结果,如何在不关闭并重新打开活动的情况下填充结果。

【问题讨论】:

@niks 可以,谢谢 但现在我又遇到了一个错误@niks 我应该为此使用 Intent Service,因为它会冻结我的应用程序几秒钟,请发表评论 您能分享您遇到的错误吗?此外,UI 冻结是因为您阻塞了主线程。 Intent 服务一定会解决冻结问题。 【参考方案1】:

请更换,

ArrayAdapter listadapter = new ArrayAdapter<>(getApplication(),android.R.layout.simple_list_item_1,namelist);
                    listadapter.notifyDataSetChanged();
                    listView.setAdapter(listadapter);

下面的代码,

ArrayAdapter listadapter = new ArrayAdapter<>(getApplication(),android.R.layout.simple_list_item_1,namelist);
                    listView.setAdapter(listadapter);
                    listadapter.notifyDataSetChanged();

【讨论】:

以上是关于将 SQLite 表数据显示到列表视图中,就在将数据插入同一 Activity 上的表之后,无需关闭 Activity 并重新打开的主要内容,如果未能解决你的问题,请参考以下文章

如何使用列表视图在选项卡式活动的片段中呈现 SQLite 表数据 [重复]

如何在将数据推送到导航堆栈之前将数据传递给视图控制器并加载它?

如何在片段类的列表视图中显示 SQLite 数据库?

如何将数据传递给 ASP.NET MVC 中的模式视图

Android:如何在列表视图中自动显示带有复选框的 Sqlite 数据库

检索在 sqlite 数据库中插入的所有行,并在包含标签的表视图单元格中显示为具有不同部分的子视图