Android ListView仅在应用程序重新启动时更新条目

Android ListView仅在应用程序重新启动时更新条目,android,listview,simplecursoradapter,Android,Listview,Simplecursoradapter,在这个应用程序中,我有一个listview和一个sqlitedatabase。有一个浮动操作按钮,单击该按钮将显示一个对话框,其中包含两个编辑文本,一个用于名称,另一个用于数字。问题在于,在单击对话框的添加选项后,列表视图中未显示条目。但是当活动被销毁,并且在活动上再次调用onCreate时,将显示该条目 我尝试使用adapter.notifyDataSetChanged(),但不起作用。代码如下所示: 代码 public class DetailsActivity extends AppCom

在这个应用程序中,我有一个
listview
和一个
sqlitedatabase
。有一个
浮动操作按钮
,单击该按钮将显示一个
对话框
,其中包含两个
编辑文本
,一个用于名称,另一个用于数字。问题在于,在单击
对话框的
添加
选项后,
列表视图中未显示条目。但是当
活动
被销毁,并且在
活动
上再次调用
onCreate
时,将显示该条目

我尝试使用
adapter.notifyDataSetChanged()
,但不起作用。代码如下所示:

代码

public class DetailsActivity extends AppCompatActivity {

private DatabaseManager manager;
private ListView listView;
private SimpleCursorAdapter adapter;

final String[] from=new String[] {UserDatabase.NAME,UserDatabase.NUMBER};

final int[] to=new int[] {R.id.nameDisplay,R.id.phoneDisplay};


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_details);

    manager = new DatabaseManager(getApplicationContext());
    manager.open();
    Cursor cursor=manager.fetch();

    listView = (ListView) findViewById(R.id.listViewId);
    listView.setEmptyView(findViewById(R.id.empty));

    adapter = new SimpleCursorAdapter(getApplicationContext(),
            R.layout.row_item, cursor, from, to, 0);
    adapter.notifyDataSetChanged();

    listView.setAdapter(adapter);

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            final AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(DetailsActivity.this);
            LayoutInflater inflater = DetailsActivity.this.getLayoutInflater();
            final View dialogView = inflater.inflate(R.layout.custom_dialog, null);
            dialogBuilder.setView(dialogView);
            final EditText name = (EditText) dialogView.findViewById(R.id.dialogEditNmID);
            final EditText phone = (EditText) dialogView.findViewById(R.id.dialogEditPhID);

            dialogBuilder.setTitle("Add Details");
            dialogBuilder.setPositiveButton("Add", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    if (!TextUtils.isEmpty(name.getText().toString()) &&
                            !TextUtils.isEmpty(phone.getText().toString())) {
                        /*adapter.notifyDataSetChanged();
                        manager.insert(name.getText().toString(), phone.getText().toString());
                        Toast.makeText(getApplicationContext(),
                                "Added " + name.getText().toString(), Toast.LENGTH_SHORT).show();*/
                        insertData(name.getText().toString(),phone.getText().toString());
                    } else {
                        Toast.makeText(getApplicationContext(),
                                "Empty field(s)", Toast.LENGTH_SHORT).show();
                    }

                }
            });

            dialogBuilder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();
                }
            });

            AlertDialog b = dialogBuilder.create();
            b.show();
            //  listView.setAdapter(adapter);
            //adapter.notifyDataSetChanged();
        }
    });
}

public void insertData(String fname,String phnumber){
    manager.insert(fname,phnumber);
    listView.setAdapter(adapter);
    adapter.notifyDataSetChanged();
}
}

某些语句被注释,因为我试图获得所需的结果,但未能获得结果。

尝试在插入操作后使用notifyDataSetChanged。在您调用(尝试调用)的所有位置,notify manager数据尚未更改。

尝试在插入操作后使用notifyDataSetChanged。在您呼叫(尝试呼叫)的所有地方,notify manager数据尚未更改。

我对代码做了一些更改,请尝试一下,并告诉我是否有用

public class DetailsActivity extends AppCompatActivity {

private DatabaseManager manager;
private ListView listView;
private SimpleCursorAdapter adapter;

final String[] from=new String[] {UserDatabase.NAME,UserDatabase.NUMBER};

final int[] to=new int[] {R.id.nameDisplay,R.id.phoneDisplay};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_details);

    manager = new DatabaseManager(getApplicationContext());
    manager.open();


    listView = (ListView) findViewById(R.id.listViewId);
    listView.setEmptyView(findViewById(R.id.empty));
    adapter = new SimpleCursorAdapter(getApplicationContext(),R.layout.row_item, cursor, from, to, 0);
    //adapter.notifyDataSetChanged();

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            final AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(DetailsActivity.this);
            LayoutInflater inflater = DetailsActivity.this.getLayoutInflater();
            final View dialogView = inflater.inflate(R.layout.custom_dialog, null);
            dialogBuilder.setView(dialogView);
            final EditText name = (EditText) dialogView.findViewById(R.id.dialogEditNmID);
            final EditText phone = (EditText) dialogView.findViewById(R.id.dialogEditPhID);

            dialogBuilder.setTitle("Add Details");
            dialogBuilder.setPositiveButton("Add", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    if (!TextUtils.isEmpty(name.getText().toString()) &&
                            !TextUtils.isEmpty(phone.getText().toString())) {
                        adapter.notifyDataSetChanged();
                        manager.insert(name.getText().toString(), phone.getText().toString());
                        Toast.makeText(getApplicationContext(),
                                "Added " + name.getText().toString(), Toast.LENGTH_SHORT).show();

                        Cursor cursor = manager.fetch();

                        listView.setAdapter(adapter);
                    } else {
                        Toast.makeText(getApplicationContext(),
                                "Empty field(s)", Toast.LENGTH_SHORT).show();
                    }

                }
            });

            dialogBuilder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();
                }
            });

            AlertDialog b = dialogBuilder.create();
            b.show();
            //  listView.setAdapter(adapter);
            //adapter.notifyDataSetChanged();
        }
    });
}}

我对代码做了一些修改,请尝试一下,并让我知道它是否有用

public class DetailsActivity extends AppCompatActivity {

private DatabaseManager manager;
private ListView listView;
private SimpleCursorAdapter adapter;

final String[] from=new String[] {UserDatabase.NAME,UserDatabase.NUMBER};

final int[] to=new int[] {R.id.nameDisplay,R.id.phoneDisplay};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_details);

    manager = new DatabaseManager(getApplicationContext());
    manager.open();


    listView = (ListView) findViewById(R.id.listViewId);
    listView.setEmptyView(findViewById(R.id.empty));
    adapter = new SimpleCursorAdapter(getApplicationContext(),R.layout.row_item, cursor, from, to, 0);
    //adapter.notifyDataSetChanged();

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            final AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(DetailsActivity.this);
            LayoutInflater inflater = DetailsActivity.this.getLayoutInflater();
            final View dialogView = inflater.inflate(R.layout.custom_dialog, null);
            dialogBuilder.setView(dialogView);
            final EditText name = (EditText) dialogView.findViewById(R.id.dialogEditNmID);
            final EditText phone = (EditText) dialogView.findViewById(R.id.dialogEditPhID);

            dialogBuilder.setTitle("Add Details");
            dialogBuilder.setPositiveButton("Add", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    if (!TextUtils.isEmpty(name.getText().toString()) &&
                            !TextUtils.isEmpty(phone.getText().toString())) {
                        adapter.notifyDataSetChanged();
                        manager.insert(name.getText().toString(), phone.getText().toString());
                        Toast.makeText(getApplicationContext(),
                                "Added " + name.getText().toString(), Toast.LENGTH_SHORT).show();

                        Cursor cursor = manager.fetch();

                        listView.setAdapter(adapter);
                    } else {
                        Toast.makeText(getApplicationContext(),
                                "Empty field(s)", Toast.LENGTH_SHORT).show();
                    }

                }
            });

            dialogBuilder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();
                }
            });

            AlertDialog b = dialogBuilder.create();
            b.show();
            //  listView.setAdapter(adapter);
            //adapter.notifyDataSetChanged();
        }
    });
}}

在数据库中插入条目后,应再次获取数据,以便列表中有最新的条目。因此,您可以修改代码,以便能够将数据点添加到要传递给适配器的列表中,也可以在插入之后、notifyDatasetChanged()之前从数据库中重新提取数据

在数据库中插入条目后,应再次获取数据,以便列表中有最新的条目。因此,您可以修改代码,以便能够将数据点添加到要传递给适配器的列表中,也可以在插入之后、notifyDatasetChanged()之前从数据库中重新提取数据

这里有几件事你必须改变。看看这段代码:

dialogBuilder.setPositiveButton("Add", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        if (!TextUtils.isEmpty(name.getText().toString()) && !TextUtils.isEmpty(phone.getText().toString())) {
            adapter.notifyDataSetChanged();
            manager.insert(name.getText().toString(), phone.getText().toString());
            Toast.makeText(getApplicationContext(), "Added " + name.getText().toString(), Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(getApplicationContext(), "Empty field(s)", Toast.LENGTH_SHORT).show();
        }
    }
});
  • 单击“添加”按钮时,立即调用
    adapter.notifyDataSetChanged()。在您的情况下,您只能在将项目添加到
    列表视图
    后调用该函数,但您尚未添加任何内容
  • 您可以使用
    manager.insert(name.getText().toString(),phone.getText().toString())将数据插入数据库
    ,但您不使用新添加的数据更新
    listView
    。您需要将该数据插入数据库,然后将该数据添加到
    listView
  • 现在可以调用
    adapter.notifyDataSetChanged()

    我建议,当您想插入数据库时,创建一个方法来插入数据,将新数据添加到
    列表视图
    ,然后告诉适配器刷新

    编辑

    关于你最近的编辑,还有一些事情需要注意

  • 方法中不应包含
    listView.setAdapter(adapter)
    。您第一次就做对了(在onCreate()中,但在对话框生成器之前)
  • 您可以调用
    manager.insert(fname,phnumber)
    ,但仍不将新插入的数据添加到
    列表视图中
    以下是方法中应该包含的伪代码:

    public void insertData(String fname,String phnumber){
        manager.insert(fname,phnumber);
        // Code to add the data you just inserted into the manager above to `listView`.
        adapter.notifyDataSetChanged();
    }
    

    记住,
    adapter.notifyDataSetChanged()仅在
    列表视图
    发生更改时更新
    列表视图
    ,并且到目前为止,您还没有添加/删除/修改
    列表视图
    ,这里有几件事需要更改。看看这段代码:

    dialogBuilder.setPositiveButton("Add", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            if (!TextUtils.isEmpty(name.getText().toString()) && !TextUtils.isEmpty(phone.getText().toString())) {
                adapter.notifyDataSetChanged();
                manager.insert(name.getText().toString(), phone.getText().toString());
                Toast.makeText(getApplicationContext(), "Added " + name.getText().toString(), Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(getApplicationContext(), "Empty field(s)", Toast.LENGTH_SHORT).show();
            }
        }
    });
    
  • 单击“添加”按钮时,立即调用
    adapter.notifyDataSetChanged()。在您的情况下,您只能在将项目添加到
    列表视图
    后调用该函数,但您尚未添加任何内容
  • 您可以使用
    manager.insert(name.getText().toString(),phone.getText().toString())将数据插入数据库
    ,但您不使用新添加的数据更新
    listView
    。您需要将该数据插入数据库,然后将该数据添加到
    listView
  • 现在可以调用
    adapter.notifyDataSetChanged()

    我建议,当您想插入数据库时,创建一个方法来插入数据,将新数据添加到
    列表视图
    ,然后告诉适配器刷新

    编辑

    关于你最近的编辑,还有一些事情需要注意

  • 方法中不应包含
    listView.setAdapter(adapter)
    。您第一次就做对了(在onCreate()中,但在对话框生成器之前)
  • 您可以调用
    manager.insert(fname,phnumber)
    ,但仍不将新插入的数据添加到
    列表视图中
    以下是方法中应该包含的伪代码:

    public void insertData(String fname,String phnumber){
        manager.insert(fname,phnumber);
        // Code to add the data you just inserted into the manager above to `listView`.
        adapter.notifyDataSetChanged();
    }
    

    记住,
    adapter.notifyDataSetChanged()仅在
    列表视图
    发生更改时更新
    列表视图
    ,并且到目前为止,您尚未添加/删除/修改
    列表视图

    应用程序因
    空对象引用而崩溃。您在
    onClick
    方法中初始化了
    adapter
    ,但不是在它之前。我已经将它添加到onCreate方法中,我认为现在应该可以工作了。现在您已经在
    onClick
    方法中初始化了
    cursor
    。以及
    simpleCursorAdapter
    conatins cursor的参数。只需将cursor对象设置为全局。应用程序因
    null对象引用而崩溃。您在
    onClick
    方法中初始化了
    adapter
    ,但不是在它之前。我已经将它添加到onCreate方法中,我认为现在应该可以工作了。现在您已经在
    onClick
    方法中初始化了
    cursor
    。以及