回收器适配器和共享首选项
Recycler Adapter and Shared preferences
我这里有一个简单的用例,使用 shardpreferences 保存的单词列表,使用回收器视图显示。我需要添加单词和删除单词
加词:
public void get_word(String new_word) {
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString(String.valueOf(sharedPreferences.getAll().size()), new_word);
System.out.println(sharedPreferences.getAll());
editor.commit();
vocabL.add(new_word);
adapter.notifyItemInserted(vocabL.size() - 1);
VVlist.scrollToPosition(vocabL.size() -1);
}
这里的想法非常简单而且有问题,我用于共享首选项的键是数字,所以在这里我使用了大小函数,它将 return 我可以使用的下一个数字
但问题是:
public void onBindViewHolder(@NonNull RecyclerAdapter.ViewHolder holder, int position) {
holder.textView.setText(list.get(position));
holder.textView.setOnClickListener(v -> Toast.makeText(context, "Clicked on " + holder.getAbsoluteAdapterPosition(), Toast.LENGTH_SHORT).show());
holder.textView.setOnLongClickListener(view -> {
AlertDialog.Builder builder = new AlertDialog.Builder(context)
.setTitle("Delete word")
.setMessage("are you sure you want to delete?")
.setPositiveButton("yes", (dialogInterface, i) -> {
list.remove(holder.getAbsoluteAdapterPosition()); editor.remove(String.valueOf(holder.getAbsoluteAdapterPosition()));
notifyItemRemoved(holder.getAbsoluteAdapterPosition());
editor.commit();
})
.setNegativeButton("no", (dialogInterface, i) -> {
});
builder.show();
return true;
});
}
在这里,当我删除一个词时,我也丢失了密钥,所以我想问题很明显,下次我尝试添加一个词时,我覆盖了现有值
这个低效的代码还有其他问题,删除时,位置可能与键不同,因此删除了一些不应该删除的东西
上面的代码中有一个列表'list',它只是一个包含所有单词的列表,我用它来测试可能的解决方案
我是自学的,我不知道在这里使用正确的编程实践。
我能想到的唯一可能的解决方案是使用地图界面,但我觉得有更好的方法可以解决这个问题
谢谢
我就是这样做的。
1.Have一个模型换字
data class Word(var id:Long,var word:String)
2.Populate 回收者视图的单词列表。对于 ID,使用 System.nanotime() & 0xfffff。这保证了每次调用时都有一个唯一的 ID(至少我对它进行了一百万次迭代测试)。
val wordlist= mutableListOf<Word>()
for (s in 0 until 10){
val word=Word((System. nanotime & 0xfffff).toLong(),"Some random string")
worldList.add(word)
//save the word to preference with the key word.id
- 在你的适配器中的 onBindViewHolder
val word= worldList[position]
yourTextView.text=word
yourDeleteView.setOnClickListener{
val wordID=word.id
deleteWord(wordID)
}
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
holder.textView.setText(pist.get(position).toString());
holder.textView.setTag(pist.get(position).toString());
holder.textView.setOnClickListener(v -> Toast.makeText(context, "Clicked on " + holder.getAbsoluteAdapterPosition(), Toast.LENGTH_SHORT).show());
holder.textView.setOnLongClickListener(view -> {
AlertDialog.Builder builder = new AlertDialog.Builder(context)
.setTitle("Delete word")
.setMessage("are you sure you want to delete?")
.setPositiveButton("yes", (dialogInterface, i) -> {
pist.remove(holder.getAbsoluteAdapterPosition());
editor.remove(String.valueOf(view.getTag()));
notifyItemRemoved(holder.getAbsoluteAdapterPosition());
editor.commit();
})
.setNegativeButton("no", (dialogInterface, i) -> {
});
builder.show();
return true;
});
}
我找到的解决方案是使用标签进行识别,我制作了共享首选项中所有值的列表(pist),我使用单词作为键,因为它更方便,如果需要我们总是可以制作另一个键列表并相应地设置标签
我不确定这是否是解决它的专业方法,但它工作正常并且看起来足够不错不过我仍然愿意回答
我这里有一个简单的用例,使用 shardpreferences 保存的单词列表,使用回收器视图显示。我需要添加单词和删除单词
加词:
public void get_word(String new_word) {
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString(String.valueOf(sharedPreferences.getAll().size()), new_word);
System.out.println(sharedPreferences.getAll());
editor.commit();
vocabL.add(new_word);
adapter.notifyItemInserted(vocabL.size() - 1);
VVlist.scrollToPosition(vocabL.size() -1);
}
这里的想法非常简单而且有问题,我用于共享首选项的键是数字,所以在这里我使用了大小函数,它将 return 我可以使用的下一个数字 但问题是:
public void onBindViewHolder(@NonNull RecyclerAdapter.ViewHolder holder, int position) {
holder.textView.setText(list.get(position));
holder.textView.setOnClickListener(v -> Toast.makeText(context, "Clicked on " + holder.getAbsoluteAdapterPosition(), Toast.LENGTH_SHORT).show());
holder.textView.setOnLongClickListener(view -> {
AlertDialog.Builder builder = new AlertDialog.Builder(context)
.setTitle("Delete word")
.setMessage("are you sure you want to delete?")
.setPositiveButton("yes", (dialogInterface, i) -> {
list.remove(holder.getAbsoluteAdapterPosition()); editor.remove(String.valueOf(holder.getAbsoluteAdapterPosition()));
notifyItemRemoved(holder.getAbsoluteAdapterPosition());
editor.commit();
})
.setNegativeButton("no", (dialogInterface, i) -> {
});
builder.show();
return true;
});
}
在这里,当我删除一个词时,我也丢失了密钥,所以我想问题很明显,下次我尝试添加一个词时,我覆盖了现有值 这个低效的代码还有其他问题,删除时,位置可能与键不同,因此删除了一些不应该删除的东西
上面的代码中有一个列表'list',它只是一个包含所有单词的列表,我用它来测试可能的解决方案
我是自学的,我不知道在这里使用正确的编程实践。 我能想到的唯一可能的解决方案是使用地图界面,但我觉得有更好的方法可以解决这个问题 谢谢
我就是这样做的。
1.Have一个模型换字
data class Word(var id:Long,var word:String)
2.Populate 回收者视图的单词列表。对于 ID,使用 System.nanotime() & 0xfffff。这保证了每次调用时都有一个唯一的 ID(至少我对它进行了一百万次迭代测试)。
val wordlist= mutableListOf<Word>()
for (s in 0 until 10){
val word=Word((System. nanotime & 0xfffff).toLong(),"Some random string")
worldList.add(word)
//save the word to preference with the key word.id
- 在你的适配器中的 onBindViewHolder
val word= worldList[position]
yourTextView.text=word
yourDeleteView.setOnClickListener{
val wordID=word.id
deleteWord(wordID)
}
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
holder.textView.setText(pist.get(position).toString());
holder.textView.setTag(pist.get(position).toString());
holder.textView.setOnClickListener(v -> Toast.makeText(context, "Clicked on " + holder.getAbsoluteAdapterPosition(), Toast.LENGTH_SHORT).show());
holder.textView.setOnLongClickListener(view -> {
AlertDialog.Builder builder = new AlertDialog.Builder(context)
.setTitle("Delete word")
.setMessage("are you sure you want to delete?")
.setPositiveButton("yes", (dialogInterface, i) -> {
pist.remove(holder.getAbsoluteAdapterPosition());
editor.remove(String.valueOf(view.getTag()));
notifyItemRemoved(holder.getAbsoluteAdapterPosition());
editor.commit();
})
.setNegativeButton("no", (dialogInterface, i) -> {
});
builder.show();
return true;
});
}
我找到的解决方案是使用标签进行识别,我制作了共享首选项中所有值的列表(pist),我使用单词作为键,因为它更方便,如果需要我们总是可以制作另一个键列表并相应地设置标签 我不确定这是否是解决它的专业方法,但它工作正常并且看起来足够不错不过我仍然愿意回答