【问题标题】:listview item removes but comes back when app restartslistview 项目已删除,但在应用重新启动时又回来了
【发布时间】:2018-02-05 16:21:28
【问题描述】:

我有一个自定义数组适配器,我可以创建我的列表视图并向其中添加项目。我创建了一个上下文菜单来删除长按的项目,上下文菜单启动我选择删除项目消失(我庆祝)我重新启动应用程序,项目又回来了(我尖叫)。这是带有我的“删除”代码的上下文菜单

@Override
public boolean onContextItemSelected(MenuItem item) {
    AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
      switch (item.getItemId()){
        case R.id.menu_deleteItem:
            ca.remove(ca.getItem(info.position)); 
            ca.notifyDataSetChanged();

            return true;
        default:
            return super.onContextItemSelected(item);
    }
}

在我声明 CarAdapter ca; 的 Activity 顶部,CarAdapter 是我的自定义数组

这里是创建

//this populates the list view
@Override
protected void onResume() {
    super.onResume();
    main_car_list.setAdapter(null);
    ArrayList<Cars> cars = Utilities.getAllSavedCars(this);
  //for context menu
    registerForContextMenu(main_car_list);

    if(cars == null || cars.size() == 0){
        Toast.makeText(this,"you have no cars added", Toast.LENGTH_SHORT).show();
        return;
    }else{
        //removed CarAdapter ca and moved CarAdapter up top so could use to delete items
        ca = new CarAdapter(this, R.layout.car_list, cars); //from caradapter
        main_car_list.setAdapter(ca);



//when click item(car) opens new activity
        main_car_list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int postion, long l) { //tabbed automatically filled in this
                String fileName = ((Cars)main_car_list.getItemAtPosition(postion)).getDateTime() + Utilities.FILE_EXTENSION; //gets filename

                Intent viewCar = new Intent(getApplicationContext(),CarDetails.class); //when clicked on item in list opens deails
                //this is how pass data between activities

                viewCar.putExtra("Car_File", fileName);  //Car_File is a key (like naming the file)

                startActivity(viewCar);
            }
        });
        }
    }

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.context_menu, menu);
}

我的实用工具活动中的删除汽车方法

 //deletes car
 public static boolean deleteCar(Context context, String fileName){
    File dir = context.getFilesDir();
    File filename = new File(dir,fileName); 

    if(filename.exists()){
        filename.delete();
     }
     return true;
  }

【问题讨论】:

  • 你能告诉我们你的 onCreate 方法吗?特别是您初始化适配器的位置
  • 您是否要从加载它的位置删除元素?
  • @EduardoHerzer 我在一个活动中创建我的项目,然后在 main_activity 上显示它们我的上下文菜单在主要活动上被调用......这就是你要问的
  • @branedge 我想说你必须从加载它的地方删除它,而不仅仅是从列表中删除。我做了一个答案,看看它是否解决了你的问题

标签: android listview android-arrayadapter custom-arrayadapter


【解决方案1】:

您的cars 列表已在此处加载

ArrayList<Cars> cars = Utilities.getAllSavedCars(this);

但是当你删除时,你只从适配器中删除。

您必须从已创建的 Cars 的 ArrayList 中删除。

@Override
public boolean onContextItemSelected(MenuItem item) {
    AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
      switch (item.getItemId()){
        case R.id.menu_deleteItem:
            ca.remove(ca.getItem(info.position)); 
            ca.notifyDataSetChanged();

            //delete from my storage
            Utilities.deleteCar(ca.getItem(info.position));

            return true;
        default:
            return super.onContextItemSelected(item);
    }
}

【讨论】:

  • 打败我吧 :)
  • @Eduardo 抱歉,请与我裸露!当我添加 Utilities.deleteCar(ca.getItem(info.position));到 onContextItemSelected 我抛出一个错误是我的 deleteCar 方法在我的 Utilities 中是否错误?//deletes car public static boolean deleteCar(Context context, String fileName){ File dir = context.getFilesDir();文件文件名 = 新文件(目录,文件名); //认为它的文件名,教程称之为文件 if(filename.exists()){ filename.delete(); } 返回真; }
  • @branedge 这看起来太长了,无法评论。但简而言之:您的方法 deleteCar 需要 ContextString 作为参数,而不仅仅是您的 Car 对象。因此,您应该将其更改为仅删除一辆车。如何实现删除方法对我来说似乎是另一个问题......
  • @EduardoHerzer 感谢您的帮助,终于让它工作了(将您的回答标记为已接受)最终修复是 Utilities.deleteCar(getApplicationContext(), ((Cars)main_car_list.getItemAtPosition(info.position))。 getDateTime() + Utilities.FILE_EXTENSION);
猜你喜欢
  • 2021-04-11
  • 2017-09-30
  • 1970-01-01
  • 2015-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多