2017-01-16 177 views
1

在我的代碼中,藉助上下文菜單,我可以從Listview中刪除特定項目,但由於我使用sharedpreferences來保存名爲「places」的數組列表,因此它將恢復應用程序重新啓動時的共享首選項。現在,我應該如何實現我的共享首選項,以便在從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:如果您的共享首選項中有一個列表,而不是通過從listview中刪除數據的數據更新共享首選項。

情況2:如果您爲每個列表項分配了不同的key_name,那麼只需從共享首選項中刪除數據時刪除或清除該key_name即可。

+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

我在這裏要做的是有一個名爲Places的數組列表,所以當我通過刪除places.remove(info.position)從中刪除一個元素時,它也應該從sharedpreferences中刪除。 –

+0

如果地方有{Add new location,xyz,abc};所以如果我刪除abc然後sharedpreference也應該刪除它。但是,我的代碼發生了什麼事情,當我刪除它時被刪除爲本地更改,但當它在殺死它後重新啓動應用程序時,它返回,因爲它被保存在sharedpreference –

+0

好吧,那就是我得到的,我認爲我的例子將解決您的問題。順便說一下,您應該考慮轉移到像數據庫這樣的永久性存儲器來存儲位置。這將是更容易管理 – LucioB