Android 删除ListView中的数据库项(从ArrayAdapter创建)
我已经创建了一个数据库,它使用Android 删除ListView中的数据库项(从ArrayAdapter创建),android,listview,android-sqlite,android-arrayadapter,Android,Listview,Android Sqlite,Android Arrayadapter,我已经创建了一个数据库,它使用阵列适配器显示在列表视图中。我希望在弹出带有删除选项的上下文菜单时删除选中的列表视图项,如下所示: 我有一个类来处理所有的数据库函数,比如delete。当我使用带有按钮的普通onCLicklistener时,删除功能将正确执行,即删除正确的数据库条目并到达if(cursor.moveToFirst())行。当我使用delete菜单项时,它不会到达附加的delete handler函数中的if(cursor.moveToFirst())行,因此不会删除条目(附加在下
阵列适配器显示在列表视图中。我希望在弹出带有删除选项的上下文菜单时删除选中的列表视图
项,如下所示:
我有一个类来处理所有的数据库函数,比如delete。当我使用带有按钮的普通onCLicklistener
时,删除功能将正确执行,即删除正确的数据库条目并到达if(cursor.moveToFirst()
)行。当我使用delete菜单项时,它不会到达附加的delete handler函数中的if(cursor.moveToFirst())行,因此不会删除条目(附加在下面的ListView
代码段之后的是删除处理程序)
任何帮助/指导/示例都将不胜感激
My列表视图的填充方式如下:
public class Listview extends AppCompatActivity
{
private ListView users;
FloatingActionButton fab;
MyDBHandler dbHandler;
ArrayAdapter<String> arrayAdapter;
String lists;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
StrictMode.ThreadPolicy policy = new
StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
setContentView(R.layout.activity_listview);
// Create back button in action bar
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);
users = (ListView) findViewById(R.id.clientlst);
// Floating Action bar for adding new data entries
fab = (FloatingActionButton) findViewById(R.id.fab1);
MyDBHandler dbHandler = new MyDBHandler(getApplicationContext());
lists = dbHandler.loadHandler();
//Create a list of the saved database String array items and split into
Strings
ArrayList<String> list = new ArrayList<>
(Arrays.asList(lists.split("\n")));
// Create the List view adapter
arrayAdapter = new ArrayAdapter<String>(Listview.this,
android.R.layout.simple_list_item_1, android.R.id.text1, list)
{
@Override // Edit the Text colour of the Listview items
public View getView(int position, View convertView, ViewGroup parent)
{
String Items = arrayAdapter.getItem(position);
String[] separated = Items.split(":");
String Name123 = separated[1]; // This will contain "Name"
TextView textView = (TextView) super.getView(position,
convertView, parent);
textView.setTextColor(Color.BLUE);
textView.setText(Name123);
return textView;
}
};
users.setAdapter(arrayAdapter);
registerForContextMenu(users);
// Create an action to be performed by each click of an item in the
users.setOnItemClickListener
(
new AdapterView.OnItemClickListener()
{
@Override
public void onItemClick(AdapterView<?> parent, View
view, int position, long id) {
String Items = arrayAdapter.getItem(position);
String[] separated = Items.split(":");
String ip = separated[5]; // This will contain "PORT address"
String port = separated[3]; // This will contain "IP number"
Toast.makeText(Listview.this, port + ip,
Toast.LENGTH_LONG).show();
} // onItemClick
} // OnItemClickListener View
); // OnItemClickListener
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view)
{
Toast.makeText(Listview.this, "Fab
Clicked", Toast.LENGTH_LONG).show();
}
}
);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenu.ContextMenuInfo menuInfo)
{
super.onCreateContextMenu(menu, v, menuInfo);
menu.setHeaderTitle("Choose an option");
MenuInflater inflator = getMenuInflater();
inflator.inflate(R.menu.example_menu, menu);
}
@Override
public boolean onContextItemSelected(MenuItem item)
{
AdapterView.AdapterContextMenuInfo info =
(AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
switch (item.getItemId())
{
case R.id.option_1:
arrayAdapter.getItem(info.position);
MyDBHandler dbHandler = new MyDBHandler(getApplicationContext());
String Items= arrayAdapter.getItem(info.position);
String[] separated = Items.split(":");
String ip = separated[3]; // This will
contain "IP addr"
String names = separated[1]; // This will
contain "Name"
Log.d("LATE",names + ip);
dbHandler.deleteHandler(names,ip);
arrayAdapter.notifyDataSetChanged(); // Refresh the
listview
Toast.makeText(this, "Deleted", Toast.LENGTH_SHORT).show();
Intent listviews1 = new Intent(Listview.this, Listview.class);
startActivity(listviews1);
return true;
case R.id.option_2:
Intent listviews2 = new Intent(Listview.this, Listview.class);
startActivity(listviews2);
Toast.makeText(this, "Updated", Toast.LENGTH_SHORT).show();
return true;
default:
return super.onContextItemSelected(item);
}
}
}
public void deleteHandler(String username, String IP)
{
//boolean result = false;
String query = "Select*FROM " + TABLE_USER + " WHERE " + COLUMN_NAME + "
= '" + String.valueOf(username) + "'" + " and " + COLUMN_ID + " = '" +
String.valueOf(IP) + "'";
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(query, null);
Log.d ("MEH", String.valueOf(cursor));
User user = new User();
if (cursor.moveToFirst())
{
user.setUserName(cursor.getString(2));
user.setID(cursor.getString(3));
db.delete(TABLE_USER, COLUMN_NAME + "=? and " + COLUMN_ID + "=?",
new String[]
{
String.valueOf(user.getUserName()),
String.valueOf(user.getID())
});
cursor.close();
//result = true;
}
db.close();
//return result;
}
- 删除此项
- 确保列ID是主键
- 检查方法是否正在调用
你应该试试看
public void deleteHandler(String username, String IP)
{
SQLiteDatabase db = this.getWritableDatabase();
db.delete(TABLE_USER,
COLUMN_NAME + " = ? AND " + COLUMN_ID + " = ?",
new String[] {username, IP});
db.close();
}
- 删除此项
- 确保列ID是主键
- 检查方法是否正在调用
你应该试试看
public void deleteHandler(String username, String IP)
{
SQLiteDatabase db = this.getWritableDatabase();
db.delete(TABLE_USER,
COLUMN_NAME + " = ? AND " + COLUMN_ID + " = ?",
new String[] {username, IP});
db.close();
}
您没有调用任何方法从用户的数据库中删除该项。setOnItemClickListener
当您在评论中添加内容时,您所做的只是尝试从ActionBar
的onItemClicked
方法中删除该项
在您的监听器中执行同样的操作
更新2:需求变更
users.setLongClickable(true);
users.setOnItemLongClickListener(new OnItemLongClickListener() {
public boolean onItemLongClick(AdapterView<?> parent, View v, int position, long id) {
//Do your tasks here
AlertDialog.Builder alert = new AlertDialog.Builder(
YourActivity.this);
alert.setTitle("Alert!!");
alert.setMessage("Choose an option");
alert.setPositiveButton("Edit", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//do your work here
dialog.dismiss();
}
});
alert.setNegativeButton("Delete", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//perform your delete callback here
dialog.dismiss();
}
});
alert.show();
return true;
}
});
users.setLongClickable(true);
users.setOnItemLongClickListener(新的OnItemLongClickListener(){
公共布尔值长单击(AdapterView父对象、视图v、整型位置、长id){
//在这里完成你的任务
AlertDialog.Builder alert=新建AlertDialog.Builder(
你的活动;
alert.setTitle(“alert!!”);
alert.setMessage(“选择一个选项”);
alert.setPositiveButton(“编辑”,新的OnClickListener(){
@凌驾
public void onClick(DialogInterface dialog,int which){
//你在这里工作吗
dialog.dismise();
}
});
alert.setNegativeButton(“删除”,新的OnClickListener(){
@凌驾
public void onClick(DialogInterface dialog,int which){
//在此处执行删除回调
dialog.dismise();
}
});
alert.show();
返回true;
}
});
更新1:回答说明
原因是什么
cursor.moveToFirst()
不是一个好选项,因为
这是不必要的。编译器知道何时命中的确切位置
在数据库中输入。通常执行cursor.moveToFirst()
当您需要遍历所有或某些数据元素时
数据库
“确保,COLUMN\u ID
是PRIMARY Key
”这背后的原因是为了避免在运行时添加添加项的功能时出现重复李>
您没有调用任何方法从用户的数据库中删除该项。setOnItemClickListener
当您在评论中添加内容时,您所做的只是尝试从ActionBar
的onItemClicked
方法中删除该项
在您的监听器中执行同样的操作
更新2:需求变更
users.setLongClickable(true);
users.setOnItemLongClickListener(new OnItemLongClickListener() {
public boolean onItemLongClick(AdapterView<?> parent, View v, int position, long id) {
//Do your tasks here
AlertDialog.Builder alert = new AlertDialog.Builder(
YourActivity.this);
alert.setTitle("Alert!!");
alert.setMessage("Choose an option");
alert.setPositiveButton("Edit", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//do your work here
dialog.dismiss();
}
});
alert.setNegativeButton("Delete", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//perform your delete callback here
dialog.dismiss();
}
});
alert.show();
return true;
}
});
users.setLongClickable(true);
users.setOnItemLongClickListener(新的OnItemLongClickListener(){
公共布尔值长单击(AdapterView父对象、视图v、整型位置、长id){
//在这里完成你的任务
AlertDialog.Builder alert=新建AlertDialog.Builder(
你的活动;
alert.setTitle(“alert!!”);
alert.setMessage(“选择一个选项”);
alert.setPositiveButton(“编辑”,新的OnClickListener(){
@凌驾
public void onClick(DialogInterface dialog,int which){
//你在这里工作吗
dialog.dismise();
}
});
alert.setNegativeButton(“删除”,新的OnClickListener(){
@凌驾
public void onClick(DialogInterface dialog,int which){
//在此处执行删除回调
dialog.dismise();
}
});
alert.show();
返回true;
}
});
更新1:回答说明
原因是什么
cursor.moveToFirst()
不是一个好选项,因为
这是不必要的。编译器知道何时命中的确切位置
在数据库中输入。通常执行cursor.moveToFirst()
当您需要遍历所有或某些数据元素时
数据库
“确保,COLUMN\u ID
是PRIMARY Key
”这背后的原因是为了避免在运行时添加添加项的功能时出现重复李>
您没有从用户调用任何deleteFromDatabase方法。setOnItemClickListener
检查我的答案。@Dennis我想在ItemClick上使用它来执行其他功能,例如移动到新活动。只有当用户“长”单击listview项时,菜单才会弹出,并带有删除选项。用你的建议答案行吗?嗯,你应该有门蒂