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
。以及