Android 从列表中删除已删除的项目

Android 从列表中删除已删除的项目,android,Android,我有一个字符串列表视图 我想删除已删除的项目 在下面的代码中,该项在数据库中被删除(关闭并重新打开可确认这一点) 在这里我想删除删除的项目 @Override public boolean onContextItemSelected(MenuItem item) { // TODO Auto-generated method stub int menuItemIndex = item.getItemId(); final AdapterContextMenuInfo

我有一个字符串列表视图

我想删除已删除的项目

在下面的代码中,该项在数据库中被删除(关闭并重新打开可确认这一点)

在这里我想删除删除的项目

@Override
public boolean onContextItemSelected(MenuItem item) {
    // TODO Auto-generated method stub
     int menuItemIndex = item.getItemId();
     final AdapterContextMenuInfo menuInfo = (AdapterContextMenuInfo) item.getMenuInfo(); 
     final int pos = menuInfo.position;
      String menuItemName =menuItems[menuItemIndex];
     if(menuItemName=="Delete")
     {
         try{
         Locations l= (Locations)locations.get(pos);
         int id= l.get_id();
        if( db.deleteLocation(id))
        {
         locations.remove(pos);
         arrayAdapter.notifyDataSetChanged();
        }else
        {
            Toast.makeText(this,"Can not delet a location  with apartment blocks",Toast.LENGTH_LONG).show();
        }

         }catch(Exception e)
         {
             e.printStackTrace();
         }
     }
    return super.onContextItemSelected(item);
}
这是整个活动的代码

注意:该项在数据库中被删除,但在我关闭并重新打开列表之前一直显示

package com.example.metermanager;

import java.util.ArrayList;
import java.util.List;

import meter.manager.helper.DatabaseHelperClass;
import meters.model.Locations;
import android.app.Activity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ContextMenu.ContextMenuInfo;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
import android.widget.AdapterView.AdapterContextMenuInfo;

public class ApartmentLocations extends Activity {
    private DatabaseHelperClass db; 
    private List<Locations> locations= new ArrayList<Locations>();
     String[] menuItems = {"Delete"};
     ArrayAdapter<String> arrayAdapter ;
    ListView list;
@Override

protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.appartment_locations);
    db= DatabaseHelperClass.getInstance(this);
    list= (ListView) findViewById(R.id.apartments_locations);   
    locations=db.GetLocations();
    List <String> s = new ArrayList<String>();

    for (Locations l:locations){
        s.add(l.toString());
    }
     arrayAdapter = new ArrayAdapter<String>(
            this, 
            android.R.layout.simple_list_item_1,
            s );

    list.setAdapter(arrayAdapter); 
    registerForContextMenu(list);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
        ContextMenuInfo menuInfo) {
    if (v.getId()==R.id.apartments_locations) {       
        menu.setHeaderTitle("Choose a menu item");             
        for (int i = 0; i<menuItems.length; i++) {
            menu.add(Menu.NONE, i, i, menuItems[i]);
        }
}
}
@Override
public boolean onContextItemSelected(MenuItem item) {
    // TODO Auto-generated method stub
     int menuItemIndex = item.getItemId();
     final AdapterContextMenuInfo menuInfo = (AdapterContextMenuInfo) item.getMenuInfo(); 
     final int pos = menuInfo.position;
      String menuItemName =menuItems[menuItemIndex];
     if(menuItemName=="Delete")
     {
         try{
         Locations l= (Locations)locations.get(pos);
         int id= l.get_id();
        if( db.deleteLocation(id))
        {
         locations.remove(pos);
         arrayAdapter.notifyDataSetChanged();
        }else
        {
            Toast.makeText(this,"Can not delet a location  with apartment blocks",Toast.LENGTH_LONG).show();
        }

         }catch(Exception e)
         {
             e.printStackTrace();
         }
     }
    return super.onContextItemSelected(item);
}
}
package com.example.metermanager;
导入java.util.ArrayList;
导入java.util.List;
导入meter.manager.helper.DatabaseHelperClass;
输入仪表、型号、位置;
导入android.app.Activity;
导入android.os.Bundle;
导入android.view.ContextMenu;
导入android.view.Menu;
导入android.view.MenuItem;
导入android.view.view;
导入android.view.ContextMenu.ContextMenuInfo;
导入android.widget.ArrayAdapter;
导入android.widget.ListView;
导入android.widget.Toast;
导入android.widget.AdapterView.AdapterContextMenuInfo;
公共类公寓地点扩展活动{
私有数据库HelperClass数据库;
私有列表位置=新的ArrayList();
字符串[]menuItems={“Delete”};
ArrayAdapter ArrayAdapter;
列表视图列表;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
//TODO自动生成的方法存根
super.onCreate(savedInstanceState);
setContentView(右布局、公寓位置);
db=DatabaseHelperClass.getInstance(此);
列表=(ListView)findViewById(R.id.U位置);
locations=db.GetLocations();
列表s=新的ArrayList();
对于(位置l:位置){
s、 添加(l.toString());
}
arrayAdapter=新的arrayAdapter(
这
android.R.layout.simple\u list\u item\u 1,
(s),;
list.setAdapter(arrayAdapter);
registerForContextMenu(列表);
}
@凌驾
public void onCreateContextMenu(ContextMenu,视图v,
上下文菜单信息(menuInfo){
如果(v.getId()==R.id.u位置){
设置标题(“选择菜单项”);

对于(int i=0;i使用游标适配器而不是数组适配器。
更多信息:

只需在执行delete命令的ur活动中的NOTIFYDATASETCHANGE()之后添加位置。清除()

您可以使用两种方法来实现此目的:

  • 当您使用
    arrayAdapter.notifyDataSetChanged();
    时,它仅在适配器中传递的数据(列表)正在被更改时才起作用。因此,在使用此方法之前,您应该从传递的arraylist中删除数据(如果是s(列表)。
  • 因此,您应该全局声明列表变量s,然后在需要时删除该项,如:

         locations.remove(pos);
         s.remove(pos);
         arrayAdapter.notifyDataSetChanged();
    
    或 2.您可以使用SimpleCorsorAdapter,它将适合您的上下文

    此外,我还发现了一个错误:
    if(menuItemName==“Delete”)

    我们不能像这样比较java中的字符串,所以请将其更改为:

    if(menuItemName.equals(“Delete”)

    调用
    arrayAdapter.notifyDataSerChanged()
    可能重复假定您自己用数据更新列表。适配器只是再次绘制视图。换句话说,在删除项目后从数据库重新加载列表。if(menuItemName=“Delete”)到if(menuItemName.equals(“Delete”))想要一些简单的东西。可能我尝试了一个简单的游标适配器…但是我的方法已经变成了Arraylist…您是否尝试过从s数组列表中删除数据,然后调用notify方法?s应该是全局的。请更正有关删除字符串s的内容,它现在正在工作。谢谢!