2016-05-01 17 views
0

Ich möchte das Element, das ich in listView auswähle, auch aus sharedPreferences entfernen. Aber nachdem ich das Element aus der Listenansicht gelöscht habe, bleibt es immer noch in sharedPrefereces. Denn wenn ich die Daten von SharedPreferences anzeigen, ändern sich die Daten überhaupt nicht. Kann mir jemand helfen, dieses Problem zu lösen? DankeArtikel aus Arraylist in SharedPreferences mit Android Studio löschen

SharedPreferences.Java

import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.List; 

import android.content.Context; 
import android.content.SharedPreferences; 
import android.content.SharedPreferences.Editor; 

import com.amobi.picassogridview.model.Product; 
import com.google.gson.Gson; 

public class SharedPreference { 

    public static final String PREFS_NAME = "PRODUCT_APP"; 
    public static final String FAVORITES = "Product_Favorite"; 

    public SharedPreference() { 
     super(); 
    } 

    // This four methods are used for maintaining favorites. 
    public void saveFavorites(Context context, List<Product> favorites) { 
     SharedPreferences settings; 
     Editor editor; 

     settings = context.getSharedPreferences(PREFS_NAME,Context.MODE_PRIVATE); 
     editor = settings.edit(); 

     Gson gson = new Gson(); 
     String jsonFavorites = gson.toJson(favorites); 

     editor.putString(FAVORITES, jsonFavorites); 

     editor.commit(); 
    } 

    public void addFavorite(Context context, Product product) { 
     List<Product> favorites = getFavorites(context); 
     if (favorites == null) 
      favorites = new ArrayList<Product>(); 
     favorites.add(product); 
     saveFavorites(context, favorites); 
    } 

    public void removeFavorite(Context context, Product product) { 
     ArrayList<Product> favorites = getFavorites(context); 
     if (favorites != null) { 
      favorites.remove(product); 
      saveFavorites(context, favorites); 
     } 
    } 

    public ArrayList<Product> getFavorites(Context context) { 
     SharedPreferences settings; 
     List<Product> favorites; 

     settings = context.getSharedPreferences(PREFS_NAME, 
       Context.MODE_PRIVATE); 

     if (settings.contains(FAVORITES)) { 
      String jsonFavorites = settings.getString(FAVORITES, null); 
      Gson gson = new Gson(); 
      Product[] favoriteItems = gson.fromJson(jsonFavorites, 
        Product[].class); 

      favorites = Arrays.asList(favoriteItems); 
      favorites = new ArrayList<Product>(favorites); 
     } else 
      return null; 

     return (ArrayList<Product>) favorites; 
    } 
} 

CartActivity.java

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.Button; 
import android.widget.ListView; 
import android.widget.Toast; 

import com.amobi.picassogridview.adapter.ProductListAdapter; 
import com.amobi.picassogridview.model.Product; 
import com.amobi.picassogridview.utils.SharedPreference; 

import java.util.List; 

public class cartActivity extends AppCompatActivity { 

    public static final String ARG_ITEM_ID = "favorite_list"; 

    ListView favoriteList; 
    SharedPreference sharedPreference; 
    List<Product> favorites; 
    ProductListAdapter productListAdapter; 
    Button home; 

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

     sharedPreference = new SharedPreference(); 
     favorites = sharedPreference.getFavorites(this); 

     favoriteList = (ListView) findViewById(R.id.listView); 
     if (favorites == null) { 
      Toast.makeText(cartActivity.this, "Error - No Data Available", Toast.LENGTH_SHORT).show(); 
     } else { 

      if (favorites.size() == 0) { 
       Toast.makeText(this, "Anda Belum Punya Belanjaan", Toast.LENGTH_SHORT).show(); 
      } 

      if (favorites != null) { 
       productListAdapter = new ProductListAdapter(this, favorites); 
       favoriteList.setAdapter(productListAdapter); 
       favoriteList.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { 
        @Override 
        public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { 

         sharedPreference.removeFavorite(cartActivity.this, favorites.get(position)); 
         favorites.remove(position); 
         productListAdapter.notifyDataSetChanged(); 
         Toast.makeText(cartActivity.this, "Success Remove",Toast.LENGTH_SHORT).show(); 

         return true; 
        } 
       }); 
      } 
     } 

     home=(Button) findViewById(R.id.bbtnHome); 
     home.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
      } 
     }); 
    } 
    @Override 
    public void onResume() 
    { 
     super.onResume(); 
    } 

}

+0

Versuchen Sie, diese Zeile 'editor.commit()' durch 'editor.apply();' zu ersetzen. –

+0

gibt es keine andere @ShreeKrishna –

+0

hast du alle ersetzt? –

Antwort

1

wie diese versuchen, Erstellen eine Methode refreshDisplay genannt

public void refreshDisplay(){ 
    productListAdapter = new ProductListAdapter(this, favorites); 
    favoriteList.setAdapter(productListAdapter); 
    productListAdapter.notifyDataSetChanged(); 
} 

Dann diese Methode verwenden, wie,

@Override 
    public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { 

     sharedPreference.removeFavorite(cartActivity.this, favorites.get(position)); 
     favorites.remove(position); 
     refreshDisplay(); 
     Toast.makeText(cartActivity.this, "Success Remove",Toast.LENGTH_SHORT).show(); 

     return true; 
    } 
+0

es löscht das Element in sharedPreferenced nicht. . Wenn ich zu einer anderen Aktivität gehe und zurückkomme, um die Ansicht zu sehen, wird immer noch das Element angezeigt, das ich bereits gelöscht habe. –

+0

@NickyApriliani Wird es nach dem Neustart der App immer noch angezeigt? –

+0

ja es immer noch gezeigt –

1

prüfen diese Linie, denke ich, dass das Produkt aus der Liste nicht entfernt bekommt:

favorites.remove(product); 

Java verwendet Methode Objekte und finden vergleichen ist gleich der eine, die "gleich" ist, gleich. Standardmäßig vergleicht es Verweise auf Objekte (oder Werte von Nicht-Objekten: int, long, ...). Wenn also zwei Objekte nicht die gleiche Referenz haben (selbst wenn der Inhalt gleich ist), gibt die equals Methode false zurück. Dies ist in Ihrem Beispiel der Fall, wenn Sie die Liste erneut von SharedPreferences laden.

Eine Lösung besteht darin, die Methode equals in Ihrer Klasse Product zu überschreiben oder die Liste selbst zu durchlaufen und die gewünschten Werte zu vergleichen.

Verwandte Themen