2014-01-10 66 views
0

我有一個列表視圖中成功地被SharedPreferences填充填充。如何刪除列表視圖中的項目(當列表由SharedPreferences

public class FavouritesActivity extends Activity { 

ArrayAdapter<String> adapter; 
List<String> List; 
private ListView lv; 

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

    lv = (ListView) findViewById(R.id.My_Favourites); 

    SharedPreferences preferences = this.getSharedPreferences("MyPreferences", 
       Context.MODE_PRIVATE); 
    ArrayList<String> List = new ArrayList<String>(); 
    Map<String, ?> prefsMap = preferences.getAll(); 
    for (Map.Entry<String, ?> entry: prefsMap.entrySet()) { 
     List.add(entry.getValue().toString());  
    } 
    ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, 
      android.R.layout.simple_list_item_1, List); 

    lv.setAdapter(arrayAdapter); 

這個偉大的工程,但現在我想從列表中刪除項目。

lv.setOnItemLongClickListener(new OnItemLongClickListener() { 

      @Override 
      public boolean onItemLongClick(AdapterView<?> arg0, View arg1, 
        int position, long arg3) { 
       removeItemFromList(position); 
       return true; 
      } 
     }); 
} 

protected void removeItemFromList(int position) { 
     final int deletePosition = position; 
     AlertDialog.Builder alert = new AlertDialog.Builder(
       FavouritesActivity.this); 

     alert.setTitle("Delete"); 
     alert.setMessage("Are you sure you want delete this item?"); 
     alert.setPositiveButton("YES", new DialogInterface.OnClickListener() { 

      @Override 
      public void onClick(DialogInterface dialog, int which) { 
        List.remove(deletePosition); 
        adapter.notifyDataSetChanged(); 
        adapter.notifyDataSetInvalidated(); 
      } 
     }); 
     alert.setNegativeButton("CANCEL",new DialogInterface.OnClickListener(){ 

      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       dialog.dismiss(); 
      } 
     }); 
     alert.show(); 
    } 

不幸的是這部分不起作用。在AlertView顯示器,但選擇確認崩潰的應用程序。

我有一種感覺它是值得做的一Rray適配器,但我正在努力發現它。

任何人都可以指向正確的方向嗎?

崩潰日誌:

01-10 10:35:45.950: E/AndroidRuntime(1370): FATAL EXCEPTION: main 
01-10 10:35:45.950: E/AndroidRuntime(1370): Process: com.LifeSchematics.msg, PID: 1370 
01-10 10:35:45.950: E/AndroidRuntime(1370): java.lang.NullPointerException 
01-10 10:35:45.950: E/AndroidRuntime(1370):  at com.LifeSchematics.msg.FavouritesActivity$2.onClick(FavouritesActivity.java:78) 
01-10 10:35:45.950: E/AndroidRuntime(1370):  at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:166) 
01-10 10:35:45.950: E/AndroidRuntime(1370):  at android.os.Handler.dispatchMessage(Handler.java:102) 
01-10 10:35:45.950: E/AndroidRuntime(1370):  at android.os.Looper.loop(Looper.java:136) 
01-10 10:35:45.950: E/AndroidRuntime(1370):  at android.app.ActivityThread.main(ActivityThread.java:5017) 
01-10 10:35:45.950: E/AndroidRuntime(1370):  at java.lang.reflect.Method.invokeNative(Native Method) 
01-10 10:35:45.950: E/AndroidRuntime(1370):  at java.lang.reflect.Method.invoke(Method.java:515) 
01-10 10:35:45.950: E/AndroidRuntime(1370):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
01-10 10:35:45.950: E/AndroidRuntime(1370):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
01-10 10:35:45.950: E/AndroidRuntime(1370):  at dalvik.system.NativeStart.main(Native Method) 

回答

1

試試這個..

我猜你得到NPE,因爲你無法初始化都List<String> List;ArrayAdapter<String> adapter;

只需更換它..

SharedPreferences preferences = this.getSharedPreferences("MyPreferences", Context.MODE_PRIVATE); 

    //correction here 
    List = new ArrayList<String>();   
    Map<String, ?> prefsMap = preferences.getAll(); 
    for (Map.Entry<String, ?> entry: prefsMap.entrySet()) { 
     List.add(entry.getValue().toString());  
    } 

    // correction here 
    arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, List);  

    lv.setAdapter(arrayAdapter); 
+0

啊,當然。完美,謝謝你的幫助! –

+0

@AndyA很高興幫助朋友。 – Hariharan

0

ArrayList中未初始化!

ArrayAdapter<String> adapter; 
List<String> List; 

這樣:

ArrayAdapter<String> adapter = new ArrayList<String>(); 
List<String> List = new List<String>(); 

而且,從我可以從你的代碼讀取你只使用這個數組列表中刪除的東西。但是由於您使用另一個填充您的列表,因此此適配器中沒有添加任何內容。

0

試試這個:

  @Override 
      public void onClick(DialogInterface dialog, int which) { 
       // TO DO Auto-generated method stub 

        List.remove(position); 
        adapter.notifyDataSetChanged(); 
        adapter.notifyDataSetInvalidated(); 


      } 
     });