- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当用户添加注释时,该注释将保存到共享首选项中。但是当用户单击图像以删除注释时,它会被正确删除并从 sharedpreferences 中正确删除。但是当用户关闭应用程序或更改选项卡并返回时,删除的笔记数量将替换为最后一条笔记,因此它会显示所有重复的笔记来代替删除的笔记。我无法弄清楚这一点并且感到困惑:/
代码:
import android.app.Activity;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import java.util.ArrayList;
import java.util.Map;
import static android.content.Context.MODE_PRIVATE;
public class CustomListAdapter extends ArrayAdapter<String> {
private final Activity context;
private ArrayList<String> notes = new ArrayList<>();
private ImageView image;
private int imageCross;
TextView ruleNotesSet;
final SharedPreferences FeedPref= PreferenceManager.getDefaultSharedPreferences(getContext());
final SharedPreferences.Editor fd = FeedPref.edit();
public CustomListAdapter(Activity context, ArrayList<String> notes, int imageCross) {
super(context, R.layout.item,notes);
this.context=context;
this.notes = notes;
this.imageCross = imageCross;
}
public View getView(final int position, View view, ViewGroup parent) {
LayoutInflater inflater = context.getLayoutInflater();
final View rowView = inflater.inflate(R.layout.item, null, false);
ruleNotesSet = (TextView) rowView.findViewById(R.id.textView1);
image = (ImageView) rowView.findViewById(R.id.icon);
Glide.with(getContext())
.load(imageCross)
.skipMemoryCache(true)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.into(image);
image.setOnClickListener(new Button.OnClickListener(){
@Override
public void onClick(View v){
notes.remove(position);
fd.remove(Integer.toString(position));
fd.apply();
fd.commit();
notifyDataSetChanged();
}
});
ruleNotesSet.setText(notes.get(position));
fd.putString(Integer.toString(position), notes.get(position));
fd.apply();
fd.commit();
return rowView;
}
public void addNote(String data) {
notes.add(data);
}
}
日志:
10-30 13:22:30.053 2538-2538/org.app.random E/Logs: Adding a note{}
10-30 13:22:35.437 2538-2538/org.app.random E/Logs: Adding a note{0=note1}
10-30 13:22:44.927 2538-2538/org.app.random E/Logs: Adding a note{0=note1}
10-30 13:22:49.422 2538-2538/org.app.random E/Logs: Adding a note{0=note1}
10-30 13:22:51.187 2538-2538/org.app.random E/Logs: Adding a note{0=note1}
10-30 13:22:51.200 2538-2538/org.app.random E/Logs: Adding a note{0=note1}
10-30 13:22:51.211 2538-2538/org.app.random E/Logs: Adding a note{0=note1, 1=note2}
10-30 13:22:51.222 2538-2538/org.app.random E/Logs: Adding a note{0=note1, 1=note2, 2=note3}
10-30 13:23:06.252 2538-2538/org.app.random E/Logs: Change tabs/Close app{0=note1, 1=note2, 2=note3, 3=note4}
10-30 13:23:06.299 2538-2538/org.app.random E/Logs: Adding a note{0=note1, 1=note2, 2=note3, 3=note4}
10-30 13:23:06.319 2538-2538/org.app.random E/Logs: Adding a note{0=note1, 1=note2, 2=note3, 3=note4}
10-30 13:23:26.709 2538-2538/org.app.random E/Logs: Removing a note{0=note1, 2=note3, 3=note4}
10-30 13:23:26.716 2538-2538/org.app.random E/Logs: Adding a note{0=note1, 2=note3, 3=note4}
10-30 13:23:26.721 2538-2538/org.app.random E/Logs: Adding a note{0=note1, 2=note3, 3=note4}
10-30 13:23:26.747 2538-2538/org.app.random E/Logs: Adding a note{0=note1, 1=note3, 2=note3, 3=note4}
10-30 13:23:29.795 2538-2538/org.app.random E/Logs: Removing a note{1=note3, 2=note4, 3=note4}
10-30 13:23:29.799 2538-2538/org.app.random E/Logs: Adding a note{1=note3, 2=note4, 3=note4}
10-30 13:23:29.815 2538-2538/org.app.random E/Logs: Adding a note{0=note3, 1=note3, 2=note4, 3=note4}
10-30 13:23:38.491 2538-2538/org.app.random E/Logs: Change tabs/Close app{0=note3, 1=note4, 2=note4, 3=note4}
10-30 13:23:38.506 2538-2538/org.app.random E/Logs: Adding a note{0=note3, 1=note4, 2=note4, 3=note4}
10-30 13:23:38.521 2538-2538/org.app.random E/Logs: Adding a note{0=note3, 1=note4, 2=note4, 3=note4}
我已经使日志具有相当的描述性,基本上我添加了 4 个注释,按返回键删除键盘,这填充了共享首选项,我更改了选项卡,我返回并删除了注释,再次更改选项卡将注释 4 填充为删除。
编辑:
当我用 sharedpreferences 中的内容重新填充 View 时,我需要的是:
Start off with : app{0=note1, 1=note2, 2=note3, 3=note4}
Remove notes1 and note2: {1=note3, 2=note4}
When repopulating the view repopulate with only : {1=note3, 2=note4}
Instead what happens currently: {1=note3, 2=note4, 3=note4, 4=note4}
编辑:
添加更多日志,因为代码已根据以下答案更改:
10-30 17:12:31.527 12984-12984/org.random.app E/Logs: Notes in addNote{0=note 1}
10-30 17:12:31.554 12984-12984/org.random.app E/Logs: Notes in getView{0=note 1}
10-30 17:12:34.400 12984-12984/org.random.app E/Logs: Notes in addNote{0=note 1, 1=note 2}
10-30 17:12:34.415 12984-12984/org.random.app E/Logs: Notes in getView{0=note 1, 1=note 2}
10-30 17:12:36.525 12984-12984/org.random.app E/Logs: Notes in addNote{0=note 1, 1=note 2, 2=note 3}
10-30 17:12:36.542 12984-12984/org.random.app E/Logs: Notes in getView{0=note 1, 1=note 2, 2=note 3}
10-30 17:12:38.273 12984-12984/org.random.app E/Logs: Notes in getView{0=note 1, 1=note 2, 2=note 3}
10-30 17:12:38.295 12984-12984/org.random.app E/Logs: Notes in getView{0=note 1, 1=note 2, 2=note 3}
10-30 17:12:45.983 12984-12984/org.random.app E/Logs: Removing a note{0=note 1, 2=note 3}
10-30 17:12:45.991 12984-12984/org.random.app E/Logs: Notes in getView{0=note 1, 2=note 3}
10-30 17:12:45.994 12984-12984/org.random.app E/Logs: Notes in getView{0=note 1, 2=note 3}
10-30 17:12:50.951 12984-12984/org.random.app E/Logs: Change tabs/Close app{0=note 1, 2=note 3}
10-30 17:12:50.975 12984-12984/org.random.app E/Logs: Notes in getView{0=note 1, 2=note 3}
10-30 17:12:50.978 12984-12984/org.random.app E/Logs: Notes in getView{0=note 1, 2=note 3}
10-30 17:12:54.390 12984-12984/org.random.app E/Logs: Removing a note{0=note 1, 2=note 3}
10-30 17:12:54.401 12984-12984/org.random.app E/Logs: Notes in getView{0=note 1, 2=note 3}
10-30 17:12:57.466 12984-12984/org.random.app E/Logs: Change tabs/Close app{0=note 1, 2=note 3}
10-30 17:12:57.522 12984-12984/org.random.app E/Logs: Notes in getView{0=note 1, 2=note 3}
10-30 17:12:57.531 12984-12984/org.random.app E/Logs: Notes in getView{0=note 1, 2=note 3}
最佳答案
我可能会发现原因:您在 get View 中再次将字符串添加回 SharedPrefernces,每次调用它时您都会执行以下代码:
fd.putString(Integer.toString(position), notes.get(position));
fd.apply();
fd.commit();
就在下面一行:
ruleNotesSet.setText(notes.get(position));
如您所见,当适配器构建 View 以使其可见时,您正在将相同的值添加回 SharedPreferences,如果您有足够大的列表,则它的范围越大,因为向上/向下滚动将添加新的共享偏好的值(value)观。
请将它们注释掉并检查结果。
像这样创建一个类笔记:
public class Note {
private long key;
private String note;
public Note(String note) {
this.note = note;
this.key = System.currentTimeMillis();
}
public Note(long key, String note) {
this.key = key;
this.note = note;
}
public Note(String key, String note) {
this.key = Long.parseLong(key);
this.note = note;
}
public long getKey() {
return key;
}
public String getNote() {
return note;
}
public String getKeyAsString(){
return String.valueOf(key);
}
}
然后将其添加到您的 Activity(仅用于测试):
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ArrayList<Note> notes = new ArrayList<Note>();
try {
notes.add(new Note(System.currentTimeMillis(), "Note 1"));
Thread.sleep(2);
notes.add(new Note(System.currentTimeMillis(), "Note 2"));
Thread.sleep(2);
notes.add(new Note(System.currentTimeMillis(), "Note 3"));
} catch (Exception e) {
}
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
SharedPreferences.Editor edit = sp.edit();
for (Note n : notes) {
edit.putString(n.getKeyAsString(), n.getNote());
}
}
这个方法从 SharedPreferences 加载你的笔记
private List<Note> readNotes() {
List<Note> notes = new ArrayList<Note>();
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
Map<String, ?> values = sp.getAll();
for (String key : values.keySet()) {
notes.add(new Note(key, (String) values.get(key)));
}
return notes;
}
最后是您的自定义 ListAdapter:
public class CustomListAdapter extends ArrayAdapter<String> {
private final Activity context;
private ArrayList<Note> notes = new ArrayList<Note>();
private ImageView image;
private int imageCross;
TextView ruleNotesSet;
final SharedPreferences FeedPref= PreferenceManager.getDefaultSharedPreferences(getContext());
final SharedPreferences.Editor fd = FeedPref.edit();
public CustomListAdapter(Activity context, ArrayList<String> notes, int imageCross) {
super(context, R.layout.item,notes);
this.context=context;
this.notes = notes;
this.imageCross = imageCross;
}
public View getView(final int position, View view, ViewGroup parent) {
Note note = notes.get(position);
LayoutInflater inflater = context.getLayoutInflater();
final View rowView = inflater.inflate(R.layout.item, null, false);
ruleNotesSet = (TextView) rowView.findViewById(R.id.textView1);
image = (ImageView) rowView.findViewById(R.id.icon);
Glide.with(getContext())
.load(imageCross)
.skipMemoryCache(true)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.into(image);
image.setOnClickListener(new Button.OnClickListener(){
@Override
public void onClick(View v){
Note n = (Note) v.getTag();
notes.remove(n);
fd.remove(n.getKeyAsString());
fd.apply();
fd.commit();
notifyDataSetChanged();
}
});
ruleNotesSet.setText(note.getNote());
image.setTag(note);
return rowView;
}
public void addNote(String data) {
Note note = new Note(System.currentTimeMillis(), data);
fd.putString(note.getKeyAsString(), note.getNote());
fd.commit();
notes.add(note);
notifyDataSetChanged();
}
}
我相信这现在可以满足您的需要。
注意:我将时间戳作为 key ,以保证 key 永远不会重复,因此在添加新注释时不会覆盖现有 key 。
另请注意,我在每个图像上添加了相应的注释对象作为 View 标记,以便稍后在用户单击删除它时将其取回,以便我们获得正确的注释键。
请尝试一下,让我知道它是否适合您。
关于java - 从 CustomListAdapter 问题中的 SharedPreferences 中删除值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47016457/
我想知道以跨平台方式操作应用程序设置的最佳解决方案是什么。 在 iOS 中,我们可以在设置屏幕中更改应用程序外部的设置,但在 windows phone 和 android 中我们没有。 所以,我的想
我想清除除一个 SharedPreference 之外的所有内容。如果我已经保存了 10 个以上,有没有比单独删除每个更好的方法?这有点多余: preferences.edit().remove("1
我在名为 page1.dart 的页面中存储了一个值。我想从 page2.dart 或 page3.dart 访问存储的值。我怎样才能做到这一点? 最佳答案 Flutter 共享首选项实际上是作为内存
是否可以将 SharedPreferences 文件保存到自定义目录中?让我们说到 /data/data/package.name/my_prefs/。 或者是否可以检索默认保存 SharedPref
我很好奇存储库在 MVVM 架构中的作用。如果您决定将存储库添加到您的项目中,这个存储库是否只负责来自数据库或网络的数据?问题是关于 SharedPreferences 或 Files,我应该让存储库
尝试从服务创建共享首选项文件时出现以下错误: “无法为 SharedPreferences 文件/dbdata/databases/dimappers.android.pub/shared_prefs
所以我有这行代码 SharedPreferences sharedPref = getApplicationContext().getSharedPreferences(PREFS_NAME, 0);
This question already has answers here: What is a NullPointerException, and how do I fix it? (12个答案)
有谁知道 android 是否支持在一个项目中编译的多个 Android 模块之间共享相同的 sharedpreference? 我有两个共享首选项,目前当我尝试从当前模块外部的共享首选项访问一些数据
我正在搜索最大的 Android SharedPreferences 键值对,但找不到任何好的答案。其次,我想问一下,如果我有一个键,它的字符串值限制是多少。多少字符可以放入其中。如果我需要频繁更改值
我正在制作一个简单的预算跟踪应用程序。我有一个预算类,其中存储了一些变量:预算的金额、持续时间和初始值。我在 fragment 中只有一个全局预算对象,称为“预算”,我正在尝试保存它。它似乎保存得很好
我在 Flutter 应用程序中使用了 shared_preferences 插件,我想在用户选择城市时保存数据。 但是当我尝试打印它时,它只是说; Instance of 'SharedPrefer
我阅读了有关在 Flutter 应用程序中初始化 SharedPreferences 的其他答案(例如 this one ),但我想采取另一条路线:一开始就初始化 SharedPreferences
在我的 flutter 应用程序中,我实现了一个入职 View 。因为它应该只加载一次,所以我使用共享首选项来存储一个整数来表示已经显示了入职。当我在 Debug模式下运行应用程序时,一切正常。但是当
如果您使用 apply,在单独的线程中编辑共享首选项是否多余? 我的 MainActivity 的 onCreate 方法中有以下代码块: final MainActivity activit
我有 2 个 Activity ,身份验证和主页。 在身份验证中,它检查用户是否已登录,如果用户已登录,则将其重定向到Mainpage.class。这就是身份验证检查用户是否登录并重定向的方式。 Sh
为什么 toast 只显示空字符串或我在 getString 行上输入的“默认”值 @Override protected void onCreate(Bundle savedInstanceStat
我在我的项目中创建了一个模块。该模块的名称为“连接器”。现在我在 MainActivity 中创建 private SharedPreferences sPref; private S
刚接触 Java,很抱歉我的理解不够。我遇到了一个小障碍,我有一个用于连接到服务器的静态类。我正在为 SharedPreferences 使用另一个类,SharedPreferences 的一些详细信
这是一件好事。我将 int 值存储在我的共享首选项中,本质上是缓存它们,以便我可以在下次启动时将它们放入数据库中。我有一种方法可以在启动时将它们保存到数据库中。 接下来是从共享首选项中删除值以重置它们
我是一名优秀的程序员,十分优秀!