Android 从适配器中的 Room 数据库获取 ArrayList class

Android get ArrayList from Room Database in adapter class

我有一个包含多列的房间数据库 table (PartsTable)。我只需要从 table 中获取一个包含一个单词字符串的列,并且我根据 google 文档使用 table 的一个子集(PartsTuple).

现在我需要创建一个函数或其他函数来 return 获取数据的 ArrayList,我可以在我的适配器 class 中访问它。我能够 return 数据并在控制台日志中看到它(从我从 ViewModel 获取数据的主要片段),但我似乎无法使其在将 return 然后我可以从不同的 class.

访问上述数据列表

来自 DAO 的代码:

@Query("SELECT keyword FROM partsTable")
LiveData<List<PartsTuple>> getTuple();

回购代码:

public LiveData<List<PartsTuple>> getPartsTuple() {
return partsKeyword;
}

来自视图模型的代码:

public LiveData<List<PartsTuple>> getPartsTuple() {
    return partsKeyword;
}

我在日志中显示数据的片段 class:

mViewModel.getPartsTuple().observe(getViewLifecycleOwner(), new Observer<List<PartsTuple>>() {
        @Override
        public void onChanged(List<PartsTuple> partTuple) {
            Log.d(TAG, "vraceno: " + partTuple.toString());
        }
    });

,以及来自日志的数据

D/PartsFragment: vraceno: [part1, parts3, part_2]

来自适配器 class 的代码,我在其中比较字符串并突出显示它们。

ArrayTEST arrayTEST = new ArrayTEST();
        ArrayList<String> values = arrayTEST.getWordFromHardcodedList();

        String text = note.getPartsSubtitle();
        Spannable textSpannable = new SpannableString(text);

        for (int j = 0; j < values.size(); j++) {
            //word of list
            String word = String.valueOf(values.get(j));
            //find index of words
            for (int i = -1; (i = text.indexOf(word, i + 1)) != -1; i++) {
                //find the length of word for set color
                int last = i + word.length();
                
                textSpannable.setSpan(new BackgroundColorSpan(Color.parseColor("#1a0cab8f")),
                        i, last, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                textSpannable.setSpan(new ForegroundColorSpan(Color.RED),
                        i, last, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            }
        }
        if (note.getPartsSubtitle().trim().isEmpty()) {
            tvTEXT.setVisibility(View.GONE);
        } else {
            tvTEXT.setText(textSpannable);
        }

我遇到问题的部分是,我需要从数据库中获取数据列表,而不是像这样硬编码

arrayTEST.getWordFromHardcodedList();

现在 我需要从我的适配器访问这个数据列表 class 因为如果有匹配我想突出显示我的零件列表中的零件显示所有数据的主回收器视图。我可以在手动输入列表时执行此操作,但它需要根据用户输入进行动态调整。

提前致谢

在您的适配器中 class 为此列表添加一个字段 - 我将其命名为 highlightedParts。边做边观察getPartsTuple(),将得到的数据设为highlightedParts。然后您需要为 highlightedParts 创建一个自定义 setter 并且每次调用它时,更新 RecyclerView 的元素以突出显示所需的项目。对于更新,您可以使用 notifyDataSetChanged() 方法。还有其他更优化的变体,仅更新特定项目或项目范围,但您将不得不更新整个数据集。

最终使用与 Gson 的共享首选项。

在应用程序中 gradle 添加

implementation 'com.google.code.gson:gson:2.8.6'

将数据保存到片段中的SP:

SharedPreferences sharedPreferences = requireActivity().getSharedPreferences("shared_preferences", MODE_PRIVATE);
            SharedPreferences.Editor editor = sharedPreferences.edit();

            Gson gson = new Gson();
            String json = gson.toJson(myListOfData);
            editor.putString("partsKEY", json);
            editor.apply();

在适配器中加载数组class:

SharedPreferences sharedPreferences = context.getSharedPreferences("shared_preferences", MODE_PRIVATE);
        Gson gson = new Gson();
        String json = sharedPreferences.getString("partsKEY", null);
        Type type = new TypeToken<ArrayList<NoteTupleTest>>() {
        }.getType();
        partsArrayList= gson.fromJson(json, type);
        if (partsArrayList== null) {
            partsArrayList= new ArrayList<>();
        }