2017-01-16 3 views
1

В моем коде с помощью контекстного меню я могу удалить определенный элемент из списка, но поскольку я использую sharedpreferences для сохранения arraylist, называемого «местами», он восстанавливает sharedpreference, когда приложение запускается снова. Теперь, как я должен реализовать свои sharedpreferences таким образом, что когда конкретный элемент удаляется из списка, тот же элемент также удаляется из «мест» общих разделов.Удалить элемент из SharedPreference при удалении из Listview

Ниже мой фрагмент кода

static ArrayList<String> places = new ArrayList<String>(); 
    static ArrayList<LatLng> locations = new ArrayList<>(); //to save lat and long 
    static ArrayAdapter arrayAdapter; 
    public ListView listView; 
    SharedPreferences sharedPreferences; 

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

     listView = (ListView) findViewById(R.id.listView); 

     sharedPreferences = this.getSharedPreferences("com.starprojects.memorableplaces", Context.MODE_PRIVATE); 
     registerForContextMenu(listView); 

     //tricker locations 
     ArrayList<String> latitudes = new ArrayList<>(); 
     ArrayList<String> longitudes = new ArrayList<>(); 

     //initially set 
     places.clear(); 
     latitudes.clear(); 
     longitudes.clear(); 
     locations.clear(); 


     //to restore 
     try { 

      places = (ArrayList<String>) ObjectSerializer.deserialize(sharedPreferences.getString("places", ObjectSerializer.serialize(new ArrayList<>()))); 

      latitudes = (ArrayList<String>) ObjectSerializer.deserialize(sharedPreferences.getString("latitudes", ObjectSerializer.serialize(new ArrayList<>()))); 

      longitudes = (ArrayList<String>) ObjectSerializer.deserialize(sharedPreferences.getString("longitudes", ObjectSerializer.serialize(new ArrayList<>()))); 

      Log.i("palces",places.toString()); 

     } catch (IOException e) { 

      e.printStackTrace(); 

     } 

@Override 
    public boolean onContextItemSelected(MenuItem item) { 

      AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo)item.getMenuInfo(); 
     // sharedPreferences = getSharedPreferences("places",0); 
      SharedPreferences.Editor editor = sharedPreferences.edit(); 

      if((item.getTitle()).equals("Delete")) 
      { 
       places.remove(info.position); 

       editor.remove("places"); //problem is here, how to get particular index to be removed from arraylist places and save it. 
       editor.commit(); 

       arrayAdapter.notifyDataSetChanged(); 

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


     } 
} 

ответ

0

вы можете получить индекс по

AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo(); 
int index = info.position; 
+0

nope он ожидает строку –

0

это означает, что вы должны список в вас общие предпочтения или у вас есть другой ключ для общего предпочтения.

Дело 1: если у вас есть список в вашей общей предпочтении, чем обновление общей настройки с удалением данных данных из списка.

Дело 2: Если вы назначили разные ключевые_имя для каждого элемента списка, вы можете просто удалить или очистить это ключевое имя, когда данные будут удалены из общих предпочтений.

+0

вы можете реализовать в моем коде и объяснить –

+0

нет, пожалуйста, попробуйте сначала мы можем руководствоваться этим. –

0

Если у меня возник вопрос о том, что вы пытаетесь сохранить общие настройки, обновленные до того момента, когда вы показываете и наоборот. Для достижения этой цели я думаю, что вам просто нужно поставить обновленный список мест массива в общие настройки, например:

@Override 
public boolean onContextItemSelected(MenuItem item) { 

    AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo)item.getMenuInfo(); 
    SharedPreferences.Editor editor = sharedPreferences.edit(); 

    if ((item.getTitle()).equals("Delete")) { 

     // Update local list 
     places.remove(info.position); 

     // Set list into shared preferences 
     // Or if you use a JSON string you could serialize and use putString() 
     editor.putStringSet("places", places); 

     // Use apply it's async 
     editor.apply(); 

     arrayAdapter.notifyDataSetChanged(); 
     return true; 
    } 

    return super.onContextItemSelected(item); 
} 

Пожалуйста, используйте применить() вместо фиксации(). It's faster and asynchronous

+0

то, что я пытаюсь сделать здесь, это то, что есть arraylist, называемый Places, поэтому, когда я удаляю элемент из него, удаляя places.remove (info.position), тогда он также должен быть удален из sharedpreferences. –

+0

Если в местах есть {Добавить новое местоположение, xyz, abc}; поэтому, если я удалю abc, то sharedpreference также должен удалить его. Но то, что происходит с моим кодом, заключается в том, что когда я удаляю его, он удаляется как локальное изменение, но когда я перезапускаю приложение после его убийства, он возвращается, поскольку он сохраняется в sharedpreference. –

+0

Хорошо, вот что я получил, я думаю, что мой пример исправит вашу проблему. Кстати, вам стоит подумать о переходе в постоянное хранилище, таком как база данных для хранения мест. Нам будет проще управлять – LucioB

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