大家好日子。我希望从数据库中删除一些项后刷新ListView但我在remove
下面看到一条红线(无法解析)。我有以下代码。
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.listdisplay1);
dbHelper = new MyDatabaseHelper(this);
sqlcon = new InfoAPI(this);
final String name1 = getIntent().getExtras().getString("name");
BuildList(name1);
}
public void BuildList(String name) {
final String name1 = name;
sqlcon.open();
Cursor cursor=sqlcon.readEntry(name1);
String[] columns=new String[]{
MyDatabaseHelper.Weather,MyDatabaseHelper.Date,MyDatabaseHelper.Status,MyDatabaseHelper.TimeIn_Info,MyDatabaseHelper.TimeOut_Info
};
int[] to=new int[]{
R.id.weather,R.id.date,R.id.status,R.id.in,R.id.out
};
// create the adapter using the cursor pointing to the desired data
//as well as the layout information
dataAdapter = new SimpleCursorAdapter(
this, R.layout.listdispaly,
cursor,
columns,
to,
0);
ListView listView = (ListView) findViewById(R.id.listView1);
// Assign adapter to ListView
listView.setAdapter(dataAdapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> listView, View view,
int position, long id) {
// Get the cursor, positioned to the corresponding row in the result set
Cursor cursor = (Cursor) listView.getItemAtPosition(position);
// Get the state's capital from this row in the database.
String ID =
cursor.getString(cursor.getColumnIndexOrThrow("_id"));
String date1 = cursor.getString(cursor.getColumnIndexOrThrow("Date"));
Intent intent = new Intent(ListDisplay.this, UpdatePage.class);
intent.putExtra("name1", name1);
intent.putExtra("date1", date1);
intent.putExtra("ID", ID);
startActivity(intent);
}
});
listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
public boolean onItemLongClick(final AdapterView<?> p, View v, final int po, long id) {
// final long id1=id;
AlertDialog.Builder builder = new AlertDialog.Builder(ListDisplay.this);
builder.setTitle("Delete");
builder.setMessage("Are you sure you want to delete?");
builder.setIcon(android.R.drawable.ic_dialog_alert);
builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int ii) {
database = dbHelper.getWritableDatabase();
Cursor cursor = (Cursor) p.getItemAtPosition(po);
// Get the state's capital from this row in the database.
long ID =
cursor.getLong(cursor.getColumnIndexOrThrow("_id"));
sqlcon.delete(ID);
p.remove(p.getItemAtPosition(po));
dataAdapter.notifyDataSetChanged();
}
});
builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialog, int ii) {
dialog.dismiss();
}
}
);
builder.show();
return true;
}
});
}
}
有人可以帮我解决问题吗?我是android的新手,不确定这是正确的实现方式吗?谢谢
被修改
好的,所以我确实喜欢@Sanju建议的内容,现在收到此错误
10-19 04:47:48.543 2094-2094/com.example.project.project E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.example.project.project, PID: 2094
java.lang.ClassCastException: android.app.Application cannot be cast to com.example.project.project.ListDisplay
at com.example.project.project.ListDisplay$2$1.onClick(ListDisplay.java:109)
at android.support.v7.app.AlertController$ButtonHandler.handleMessage(AlertController.java:153)
at android.os.Handler.dispatchMessage(Handler.java:102)
代码已编辑
database = dbHelper.getWritableDatabase();
Cursor cursor = (Cursor) p.getItemAtPosition(po);
// Get the state's capital from this row in the database.
long ID =
cursor.getLong(cursor.getColumnIndexOrThrow("_id"));
sqlcon.delete(ID);
((ListDisplay)getApplicationContext()).finish();
Intent intent = new Intent(getApplicationContext(), ListDisplay.class);
getApplicationContext().startActivity(intent);
}
});
有什么想法吗?
最新
final
已添加到columns
,to
和listView
。
final String[] columns=new String[]{
MyDatabaseHelper.Weather,MyDatabaseHelper.Date,MyDatabaseHelper.Status,MyDatabaseHelper.TimeIn_Info,MyDatabaseHelper.TimeOut_Info
};
final int[] to=new int[]{
R.id.weather,R.id.date,R.id.status,R.id.in,R.id.out
};
// create the adapter using the cursor pointing to the desired data
//as well as the layout information
dataAdapter = new SimpleCursorAdapter(
this, R.layout.listdispaly,
cursor,
columns,
to,
0);
final ListView listView = (ListView) findViewById(R.id.listView1);
// Assign adapter to ListView
listView.setAdapter(dataAdapter);
并且喜欢这个
listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
public boolean onItemLongClick(final AdapterView<?> p, View v, final int po, long id) {
// final long id1=id;
AlertDialog.Builder builder = new AlertDialog.Builder(ListDisplay.this);
builder.setTitle("Delete");
builder.setMessage("Are you sure you want to delete?");
builder.setIcon(android.R.drawable.ic_dialog_alert);
builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int ii) {
database = dbHelper.getWritableDatabase();
Cursor cursor = (Cursor) p.getItemAtPosition(po);
// Get the state's capital from this row in the database.
long ID =
cursor.getLong(cursor.getColumnIndexOrThrow("_id"));
sqlcon.delete(ID);
}
});
Cursor cursor=sqlcon.readEntry(name1);
dataAdapter = new SimpleCursorAdapter(
getApplicationContext(), R.layout.listdispaly,
cursor,
columns,
to, 0);
//listView.setAdapter(null);
listView.setAdapter(dataAdapter);
builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialog, int ii) {
dialog.dismiss();
}
}
);
builder.show();
return true;
}
});
一切似乎都很好。但是当我长按行并AlertDialog
弹出时,所有文本都变成白色。为什么会发生这种情况?
答案 0 :(得分:2)
使用此(不编译)行,您正在尝试操作列表视图:
p.remove(p.getItemAtPosition(po));
这不是它的工作原理。不要试图直接操纵视图。使用适配器为视图提供数据的想法是,您操纵数据而不是视图,然后发出信号,表明某些内容已发生变化。诀窍是知道如何发出信号。看来你的下一行就是这样:
dataAdapter.notifyDataSetChanged();
所以删除第一行(使用p.remove),它可能实际上有效。
如果这还不够(虽然我认为应该是这样),那么你可能需要用适当的新光标交换适配器中的光标,如下所示:
Cursor cursor2 = ... // create the same way you did when you created SimpleCursorAdapter
dataAdapter.changeCursor(cursor2);
在您更新的代码中:
builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int ii) {
database = dbHelper.getWritableDatabase();
Cursor cursor = (Cursor) p.getItemAtPosition(po);
// Get the state's capital from this row in the database.
long ID =
cursor.getLong(cursor.getColumnIndexOrThrow("_id"));
sqlcon.delete(ID);
Cursor cursor2 = sqlcon.readEntry(name1);
dataAdapter.changeCursor(cursor2);
}
});
答案 1 :(得分:1)
这就是我在删除列表行时所做的事情,在你的适配器类中尝试这样的东西
delet.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
cartdata.updateSelected(Integer.parseInt(cart_pdiscription[i]), 0);
cartdata.deleteProduct(Integer.parseInt(cart_pdiscription[i]));
Intent intent = ((CartList) context).getIntent();
((CartList) context).finish();
context.startActivity(intent);
}
});
答案 2 :(得分:1)
我看到下方的红线被删除(无法解析)
这是因为类AdapterView
没有名为remove
的方法。
请参阅这些link和this。
执行代码以删除编辑中所选ID的行
database = dbHelper.getWritableDatabase();
Cursor cursor = (Cursor) p.getItemAtPosition(po);
// Get the state's capital from this row in the database.
long ID =
cursor.getLong(cursor.getColumnIndexOrThrow("_id"));
sqlcon.delete(ID);
}
});
and then try this snippet
cursor=sqlcon.readEntry(name1);
dataAdapter = new SimpleCursorAdapter(
this, R.layout.listdispaly,
cursor,
columns,
to, 0);
//listView.setAdapter(null);
listView.setAdapter(dataAdapter);
但是当我长按行并且AlertDialog弹出时,所有文本都变成白色。为什么会发生这种情况?
我不知道为什么会这样,但这个片段可以帮助你摆脱问题
builder.setInverseBackgroundForced(true);
AlertDialog dialog = builder.create();
dialog.show();
它会强制反转背景颜色。此标记仅用于素材前主题。This method was deprecated in API level 23. This flag is only used for pre-Material themes. Instead, specify the window background using on the alert dialog theme.