java - 使用 Android Studio 从 SharedPreferences 的 Arraylist 中删除项目

标签 java android listview arraylist sharedpreferences

我也想从 sharedPreferences 中删除我在 listView 中选择的项目。但是,在我从 ListView 中删除该项目后,它仍然保留在 sharedPrefereces 中。因为当我显示来自 SharedPreferences 的数据时,数据根本没有改变。谁能帮我解决这个问题?? 谢谢

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

最佳答案

这样试试 创建一个名为 refreshDisplay

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

然后像这样使用这个方法,

    @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;
    }

关于java - 使用 Android Studio 从 SharedPreferences 的 Arraylist 中删除项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36964840/

相关文章:

java - WebDriver 适用于 Chrome,但不适用于 Internet Explorer

java - 在android中更改语言时如何更改操作栏语言

c# - 添加数据后如何滚动到 ListView 的末尾 - WPF

c# - ListView 项中的多个文本项

android - WakefulIntentService 实现说明

android - 跳过 147 帧!应用程序可能在其主线程上做了太多工作

java - 如何使用java授予文件和文件夹700和770权限

java - 如何使用camel和Spring监听activemq?

java - 有没有办法在新的导航组件上按下后恢复 recyclerview 上的状态

java - Android 中如何获取 ListView 焦点?