【问题标题】:Delete Item from Arraylist in SharedPreferences with Android Studio使用 Android Studio 从 SharedPreferences 中的 Arraylist 中删除项目
【发布时间】:2016-05-01 08:54:08
【问题描述】:

我也想从 sharedPreferences 中删除我在 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();
    }

}

【问题讨论】:

  • 尝试用editor.apply();替换这行editor.commit()
  • 没有什么不同的@ShreeKrishna
  • 全部替换了吗?
  • 是的,我替换了所有@ShreeKrishna

标签: java android listview arraylist sharedpreferences


【解决方案1】:

试试这样, 创建一个名为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;
    }

【讨论】:

  • 它不会删除 sharedPreferenced 中的项目。 .当我去另一个活动并回来查看视图时,它仍然显示我已经删除的项目
  • @NickyApriliani 重启应用后是否仍然显示?
  • 那么确定你的对象没有被移除。我会尽快更新我的答案。
  • @NickyApriliani 我认为给出建议比回答更合适,因为它需要更多的改变。所以我可以建议将position 只传递给removeFavorite 方法,而不是传递一个对象。然后用favorites.remove(position);代替favorites.remove(product);
【解决方案2】:

检查此行,我认为该产品不会从您的列表中删除:

favorites.remove(product);

Java 使用 equals 方法来比较对象并找到“相同”的对象,即相等。默认情况下,它比较对对象的引用(或非对象的值:int、long、...)。因此,如果两个对象没有相同的引用(即使内容相同),equals 方法将返回 false。在您的示例中就是这种情况,因为您再次从 SharedPreferences 加载列表。

一种解决方案是覆盖 Product 类中的 equals 方法,或自行遍历列表,比较所需的值。

【讨论】:

    猜你喜欢
    • 2016-12-03
    • 1970-01-01
    • 2020-11-09
    • 1970-01-01
    • 2012-05-29
    • 1970-01-01
    • 2020-06-25
    • 2014-01-17
    相关资源
    最近更新 更多