回收器适配器和共享首选项

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

  1. 在你的适配器中的 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),我使用单词作为键,因为它更方便,如果需要我们总是可以制作另一个键列表并相应地设置标签 我不确定这是否是解决它的专业方法,但它工作正常并且看起来足够不错不过我仍然愿意回答