我有一个字符串列表视图。
我想删除已删除的项目。
在下面的代码中,该项目在数据库中被删除(关闭并重新开启确认这一点)。
这里我想删除已删除的项目
@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);
}
}
任何线索?
罗纳德
答案 0 :(得分:1)
您可以使用两件事来实现:
arrayAdapter.notifyDataSetChanged();
时,它仅在适配器中传递的数据(列表)被打开时才有效。所以在使用之前你应该在你的情况下从传递的arraylist中删除数据s(list)。所以你应该全局声明列表变量s,然后在需要时删除项目,如:
locations.remove(pos);
s.remove(pos);
arrayAdapter.notifyDataSetChanged();
OR 2.您可以使用将在您的上下文中设置的SimpleCursorAdapter http://developer.android.com/reference/android/widget/SimpleCursorAdapter.html
而且,我又发现了一个错误:
if(menuItemName=="Delete")
我们不能像这样比较java中的字符串所以请将其改为如下:
if(menuItemName.equals("Delete"))
答案 1 :(得分:0)
使用CursorAdapter而不是ArrayAdapter。 更多信息:http://developer.android.com/reference/android/widget/CursorAdapter.html
答案 2 :(得分:0)
只需在执行删除命令的ur活动中的notifydatasetchanged()之后添加locations.clear()