You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

点击按钮如何从SharedPreferences的RecyclerView列表中展示随机字符串?

解决SharedPreferences存储RecyclerView数据后点击按钮显示随机mLine1内容的问题

兄弟,你现在的问题很清晰:你直接把SharedPreferences里存的整个列表的JSON序列化字符串设置到文本框里了,所以才会显示那种包含所有字段的JSON结构,而不是你想要的单个mLine1的内容。

咱们一步步来改:

问题根源

你在点击按钮时用的randomtext是直接从SharedPreferences取出的完整JSON串(就是你saveData()里用Gson序列化整个mExampleList得到的结果),没有做反序列化和随机选取的操作,自然会显示全部数据。

修改方案

你需要在按钮点击事件里,先把JSON串反序列化成ArrayList<ExampleItem>,然后随机挑一个item,再把它的mLine1设置到文本框里。可以复用你loadData()里的反序列化逻辑:

修改后的按钮点击代码如下:

PushTheButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        btn1.startAnimation(anim1);
        
        // 1. 取出存储的JSON字符串
        SharedPreferences sharedPreferences = getSharedPreferences("shared preferences", Context.MODE_PRIVATE);
        String json = sharedPreferences.getString("task list", null);
        
        // 2. 反序列化成ExampleItem列表
        Gson gson = new Gson();
        Type type = new TypeToken<ArrayList<ExampleItem>>(){}.getType();
        ArrayList<ExampleItem> exampleList = gson.fromJson(json, type);
        
        // 3. 处理空列表的情况,避免崩溃
        if (exampleList == null || exampleList.isEmpty()) {
            StartText2.setText("没有可用数据");
            return;
        }
        
        // 4. 随机选取一个item
        Random random = new Random();
        int randomIndex = random.nextInt(exampleList.size());
        ExampleItem randomItem = exampleList.get(randomIndex);
        
        // 5. 设置mLine1内容到文本框
        StartText2.setText(randomItem.getMLine1()); // 这里要确保你的ExampleItem有getter方法,或者直接访问mLine1(如果是public字段的话)
    }
});

额外提示

  • 确保你的ExampleItem类有对应的getter方法(比如getMLine1()),如果字段是public修饰的话,也可以直接用randomItem.mLine1。
  • 可以把反序列化逻辑封装复用,比如直接调用你已经写好的loadData()获取mExampleList,再从里面随机选取,这样代码会更简洁。

内容的提问来源于stack exchange,提问作者Lokker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 09:12:52