2015-10-07 3 views
1

Я выполнил свое приложение на основе этой ссылки https://www.youtube.com/watch?v=luxE7oEKiic Однако элементы, которые я удалил, будут автоматически добавлены обратно в список после перезапуска приложения. Любая идея, что я могу сделать, чтобы удалить элемент навсегда?Android: Как удалить элемент навсегда в списке?

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

Конечно, вы будете получать одни и те же данные после перезапуска. Данные статичны. –

+0

Можете ли вы показать код для класса «LoadApplications» –

ответ

1

Ваши данные поступают из источника, когда вы звоните 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 класса удалить элементы, хранящиеся в базе данных или Shared Preferences из списка, возвращаемого из источника, перед вызовом 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, чтобы сохранить свой список. Но я бы рекомендовал вам подробно ознакомиться с поставщиками контента и SharedPrefs.

+0

Я загрузил метод LoadApplication. Я читал об «Предпочтениях», но для этого нет четкого примера. – Dave

0

Вы должны сохранить измененные данные в onSaveInstanceState. Когда вы перезапустите действие, сначала проверьте комплект savedInstanceState. Если он не равен нулю, восстановите данные из Bundle вместо получения его из исходного источника.

Если вы имеете в виду старт без savedInstanceState, вам необходимо изменить источник данных. Если вы не можете, вы можете записывать свои операции или измененные данные в своем собственном хранилище.

+0

Вы имеете в виду, что я должен переместить мои методы в onSaveInstance вместо этого (я загрузил свой код)? Прошу прощения за то, что я новичок в андроид-студии. – Dave

+0

Нет, просто сохраните данные в 'onSaveInstanceState'. Но если ваше приложение полностью убито, это не сработает. Если источник данных остается неизменным, данные каждый раз, когда вы извлекаете, одинаковы. Если вы не используете специализированное хранилище, такое как sqlite или разделяемое предпочтение для хранения измененных данных. – ProtossShuttle

Смежные вопросы