Android:如何在 ListView 中永久删除一个项目?

标签 android listview

我已经根据此引用文献实现了我的应用程序 https://www.youtube.com/watch?v=luxE7oEKiic但是,我删除的项目将在重新启动应用程序时自动添加回列表中。知道我该怎么做才能永久删除该项目吗?

private PackageManager packageManager = null;
private List<ApplicationInfo> applist = null;
private AppAdapter listadapter = null;
ListView list;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    packageManager = getPackageManager();

    new LoadApplications().execute();
   list = (ListView) findViewById(android.R.id.list);

    listadapter = new AppAdapter(this, R.layout.activity_list_app, applist);
    list.setAdapter(listadapter);
    list.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);

    list.setMultiChoiceModeListener(new AbsListView.MultiChoiceModeListener() {

        @Override
        public boolean onPrepareActionMode(ActionMode arg0, Menu arg1) {
            // TODO Auto-generated method stub
            return false;
        }

        @Override
        public void onDestroyActionMode(ActionMode arg0) {
            listadapter.removeSelection();
        }

        @Override
        public boolean onCreateActionMode(ActionMode arg0, Menu arg1) {
            arg0.getMenuInflater().inflate(R.menu.menu_main, arg1);
            return true;
        }

        @Override
        public boolean onActionItemClicked(ActionMode arg0, MenuItem arg1) {
            switch (arg1.getItemId()) {
                case R.id.delete:
                    SparseBooleanArray selected = listadapter.getSelectedIds();

                    for(int i = (selected.size() - 1); i >= 0; i--) {
                        if(selected.valueAt(i)) {
                            ApplicationInfo selecteditem = listadapter.getItem(selected.keyAt(i));
                            listadapter.remove(selecteditem);
                        }
                    }
                    arg0.finish();
                    return true;

                default:
                    return false;
            }
        }

        @Override
        public void onItemCheckedStateChanged(ActionMode mode, int position,
                                              long id, boolean checked) {
            final int checkedCount = list.getCheckedItemCount();
            mode.setTitle(checkedCount + " Selected");
            listadapter.toggleSelection(position);

        }

        public void onItemClick(AdapterView<?> parent, View view, int position, long id)
        {
            view.setSelected(true);
        }
    });
}

protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
}

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
}

protected void onListItemClick(ListView l, View v, int position, long id){
    super.onListItemClick(l, v, position, id);

    ApplicationInfo app = applist.get(position);

    try{
        Intent intent = packageManager.getLaunchIntentForPackage(app.packageName);

        if(intent != null){
            startActivity(intent);
        }
    }catch(ActivityNotFoundException e){
        Toast.makeText(MainActivity.this,e.getMessage(), Toast.LENGTH_LONG).show();
    }catch(Exception e){
        Toast.makeText(MainActivity.this,e.getMessage(), Toast.LENGTH_LONG).show();
    }
}

private List<ApplicationInfo> checkForLaunchIntent(List<ApplicationInfo> list){
    ArrayList<ApplicationInfo> appList = new ArrayList<ApplicationInfo>();
    for(ApplicationInfo info : list){
        try{
            if(packageManager.getLaunchIntentForPackage(info.packageName)!=null){
                appList.add(info);
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    }
    return appList;
}

private class LoadApplications extends AsyncTask<Void, Void, Void>{
    private ProgressDialog progress = null;

    protected Void doInBackground(Void... params){
        applist = checkForLaunchIntent(packageManager.getInstalledApplications(PackageManager.GET_META_DATA));
        listadapter = new AppAdapter(MainActivity.this, R.layout.activity_list_app, applist);
        return null;
    }
    protected void onPostExecute(Void result){
        setListAdapter(listadapter);
        progress.dismiss();
        super.onPostExecute(result);
    }
    protected void onPreExecute(){
        progress = ProgressDialog.show(MainActivity.this, null, "Loading apps info...");
        super.onPreExecute();
    }
}

最佳答案

当您调用 new LoadApplications().execute(); 时,您的数据来自某个来源.

此任务从源列表中获取所有项目。为了完全删除该项目(这样,即使在应用程序关闭并重新打开之后)您需要在数据库或共享首选项中保存用户删除的项目列表。

    @Override
    public boolean onActionItemClicked(ActionMode arg0, MenuItem arg1) {
        switch (arg1.getItemId()) {
            case R.id.delete:
                SparseBooleanArray selected = listadapter.getSelectedIds();

                for(int i = (selected.size() - 1); i >= 0; i--) {
                    if(selected.valueAt(i)) {
                        ApplicationInfo selecteditem = listadapter.getItem(selected.keyAt(i));
                        listadapter.remove(selecteditem);

                        // Save the selected item in a Content Provider/Shared Pref 
                    }
                }
                arg0.finish();
                return true;

            default:
                return false;
        }
    }

并且在 postExecute LoadApplications的方法|在调用 notifyDataSetChanged 之前,类从源返回的列表中删除存储在数据库或共享首选项中的项目.

private class LoadApplications extends AsyncTask<Void, Void, Void>{
    private ProgressDialog progress = null;

    protected Void doInBackground(Void... params){
        applist = checkForLaunchIntent(packageManager.getInstalledApplications(PackageManager.GET_META_DATA));

        // Remove the items me stored in the removedList

        listadapter = new AppAdapter(MainActivity.this, R.layout.activity_list_app, applist);
        return null;
    }
    protected void onPostExecute(Void result){
        setListAdapter(listadapter);
        progress.dismiss();
        super.onPostExecute(result);
    }
    protected void onPreExecute(){
        progress = ProgressDialog.show(MainActivity.this, null, "Loading apps info...");
        super.onPreExecute();
    }
}

让您快速入门。您可以使用这个非常易于使用的类 TinyDB保存您的列表。但我建议您详细了解 Content Providers 和 SharedPrefs。

关于Android:如何在 ListView 中永久删除一个项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32982377/

相关文章:

android - 选中复选框的 ListView 中行的位置

android - 跳过 147 帧!应用程序可能在其主线程上做了太多工作

xaml - 如何在 Xamarin 中删除从 ListView 中选择的项目

android - 如何在android中更改pivotX,pivotY?

android - apkbuilder 在将 powermock 添加到 android 测试项目时发现重复文件

android - 如何从 C++ 为我的 .so 共享库调用 LoadLibrary

android - 你如何更新到最新的分支而不必再次下载所有内容?

Android:尝试从空对象引用上的“android.widget.TextView”字段读取

java - 如何使日历根据优先级列出事件

java - 连接到 Bluegiga WT-12 的 Android 蓝牙聊天应用程序