从那里删除项目时刷新列表视图

时间:2015-12-08 15:41:39

标签: android string listview android-listview

嘿,我正在开发包含listview的应用程序,其中安装的应用程序填充了一些按钮,例如卸载。

public class MainActivity extends ListActivity {
PackageManager packageManager;
List<ApplicationInfo> applist;
Listadapter listadapter;

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

    packageManager = getPackageManager();

    new LoadApplications().execute();

}

@Override
protected void onListItemClick(ListView l, View v, final int position, long id) {
    super.onListItemClick(l, v, position, id);
         AlertDialog.Builder dialogBuilder = new   AlertDialog.Builder(this);
    dialogBuilder.setTitle("Choose option")
            .setItems(R.array.options, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    switch (which) {
                        case 0:
                            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();
                            }
                            break;
                        case 1:
                            ApplicationInfo app1 = applist.get(position);
                            Uri packageURI = Uri.parse("package:" + app1.packageName);
                            Intent uninstallIntent = new Intent(Intent.ACTION_DELETE, packageURI);
                            startActivity(uninstallIntent);
                            applist.remove(listadapter.getItem(position));
                            listadapter.notifyDataSetChanged();
                            break;
                        case 2:
                            break;
                    }
                }
            });
    dialogBuilder.setCancelable(true)
            .show();

}

private List<ApplicationInfo> checkForLaunchIntent(List<ApplicationInfo> list) {
    ArrayList<ApplicationInfo> applist = new ArrayList<>();

    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;

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

        listadapter = new Listadapter(MainActivity.this, R.layout.list_item, applist);

        return null;
    }

    @Override
    protected void onPostExecute(Void aVoid) {
        setListAdapter(listadapter);
        progress.dismiss();
        super.onPostExecute(aVoid);

    }

    @Override
    protected void onPreExecute() {
        progress = ProgressDialog.show(MainActivity.this, null, "loading apps info,,,");
        super.onPreExecute();
    }

}

@Override
protected void onPause() {
    super.onPause();
        listadapter.notifyDataSetInvalidated();
}

当我点击卸载时,应用程序位置会在卸载应用程序之前被删除。

这是strings.xml

<resources>
    <string name="app_name">AppSharer</string>
    <string-array name="options">
        <item>Open App</item>
        <item>uninstall</item>
    </string-array>
</resources>

删除项目后,如何刷新列表视图。

谢谢!!!

1 个答案:

答案 0 :(得分:0)

我从问题中得到的是,如果用户点击是以卸载,则必须遇到问题,但是从设置屏幕用户返回应用程序而不卸载它。对于这种情况,创建一个变量Boolean,如果用户在卸载时单击yes并将app包名称保存在实例级别的字符串变量中,则将为true;如果用户Boolean为true,则检查class check的resume方法,然后检查定义的包是否存在,如果它不存在则更新列表视图。请参考这个,我还添加了评论,以通知您所做的更改

 public class MainActivity extends ListActivity {
    PackageManager packageManager;
    List<ApplicationInfo> applist;
    Listadapter listadapter;
    // add three variables
    String packageName="";
    boolean isUnInstallClicked;
    int mPosition;

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

        packageManager = getPackageManager();

        new LoadApplications().execute();

    }

    @Override
    protected void onListItemClick(ListView l, View v, final int position, long id) {
        super.onListItemClick(l, v, position, id);
             AlertDialog.Builder dialogBuilder = new   AlertDialog.Builder(this);
        dialogBuilder.setTitle("Choose option")
                .setItems(R.array.options, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        switch (which) {
                            case 0:
                                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();
                                }
                                break;
                            case 1:
                                ApplicationInfo app1 = applist.get(position);
                                Uri packageURI = Uri.parse("package:" + app1.packageName);
                                Intent uninstallIntent = new Intent(Intent.ACTION_DELETE, packageURI);
                                startActivity(uninstallIntent);
                                //remove applist.remove and notify from here and add it to on resume
                                packageName=app1.packageName;
                                isUnInstallClicked=true;
                                mPosition=position;

                                break;
                            case 2:
                                break;
                        }
                    }
                });
        dialogBuilder.setCancelable(true)
                .show();

    }
    @Override
        protected void onResume() {
            // TODO Auto-generated method stub
            super.onResume();
            // here check for whether unistall was clicked and was app unistalled
            if(isUnInstallClicked && !appInstalledOrNot(packageName)){
                //check whther app unistalled or not

                applist.remove(listadapter.getItem(position));
                listadapter.notifyDataSetChanged();
                }
            }
        }
    private boolean appInstalledOrNot(String uri) {
        PackageManager pm = getPackageManager();
        boolean app_installed;
        try {
            pm.getPackageInfo(uri, PackageManager.GET_ACTIVITIES);
            app_installed = true;
        }
        catch (PackageManager.NameNotFoundException e) {
            app_installed = false;
        }
        return app_installed;
    }
    private List<ApplicationInfo> checkForLaunchIntent(List<ApplicationInfo> list) {
        ArrayList<ApplicationInfo> applist = new ArrayList<>();

        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;

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

            listadapter = new Listadapter(MainActivity.this, R.layout.list_item, applist);

            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            setListAdapter(listadapter);
            progress.dismiss();
            super.onPostExecute(aVoid);

        }

        @Override
        protected void onPreExecute() {
            progress = ProgressDialog.show(MainActivity.this, null, "loading apps info,,,");
            super.onPreExecute();
        }

    }

    @Override
    protected void onPause() {
        super.onPause();
            listadapter.notifyDataSetInvalidated();