2015-12-08 58 views
0

嘿,我正在工作的应用程序,其中包含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> 

我应该怎么刷新列表视图一旦我删除的项目。

谢谢!

回答

0

我从问题中得到的结果是,如果用户点击yes进行卸载,但从设置屏幕用户回到应用程序而不卸载它,则必须有问题。在这种情况下,创建一个变量布尔值,如果用户在卸载时单击是,并在实例级别的字符串变量中保存应用包名称,并且恢复类检查方法,如果用户布尔值为true,则检查定义的包是否存在,如果它不存在,请更新您的列表视图。请参考这个,我还添加了注释,通知您更改了哪些

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(); 
+0

兄弟居然卸载工作正常...但应用程序卸载即使我看到在我的列表视图该应用......此我试过adapter.notifydatasetcange,但这是nt工作,或者我可能把它放在一些错误的地方... – Rahul

+0

可以请你给我一些代码刷新listview上resume.thanx – Rahul

+0

在applist.remove(listadapter.getItem(位置))applsit是listview对象还是arraylist对象? –

相关问题