【问题标题】:Android get ArrayList from Room Database in adapter classAndroid 从适配器类的房间数据库中获取 ArrayList
【发布时间】:2021-12-29 08:54:27
【问题描述】:

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

现在我需要创建一个函数,该函数将返回获取数据的 ArrayList,我可以在我的适配器类中访问它。我能够返回数据并在控制台日志中查看它(从我从 ViewModel 获取数据的主要片段),但我似乎无法让它在将返回上述数据列表的函数上工作然后我可以从不同的班级访问。

来自 DAO 的代码:

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

来自 repo 的代码:

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

来自视图模型的代码:

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

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

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]

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

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();

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

提前致谢

【问题讨论】:

    标签: java android arrays android-room android-livedata


    【解决方案1】:

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

    【讨论】:

    • 感谢您的建议,将尝试这样做,但这似乎采取了完全不同的方式来看待这个问题。我正在使用 liveData 并且我的适配器类扩展了 ListAdapter 所以每次调用主回收器视图时我都会在旅途中进行突出显示。我使用适配器中的代码更新了我的问题,以便您查看。
    • 如果您需要其他帮助,请告诉我。
    • 会的,谢谢。
    【解决方案2】:

    最终使用与 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();
    

    在适配器类中加载数组:

    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<>();
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-27
      • 1970-01-01
      相关资源
      最近更新 更多