首页 > 解决方案 > 无法从 json 文件取回数据

问题描述

所以我设法将数组中的数据保存在 json 文件中。这个数组是手动创建的,你可以通过 8 看到item.add(...),每个项目有 4 个值。isSelected, userName,和. userAttack_ 只有and才会改变,并且是布尔类型。我想在单击该项目后立即存储这些值的更改并且它起作用了。日志会告诉我 json 是一个包含所有信息的数组。userStatusisFavoriteisSelectedisFavoriteonItemClickListeners

我的问题是在创建应用程序时检索此信息,我不知道将其放置在哪里。不仅如此,我不知道如何在 onCreate 中使用 json 文件,因为 json 仅在我单击或长按项目时生成。有人可以提示我如何成功让应用记住该项目的值吗?将非常感谢。

    //package and imports 

    public class MainActivity extends Activity {

    ListView listView;
    private String msg = "Android : ";
    private boolean isChecked;

    ArrayList<UserModel> item = new ArrayList<>();

     @Override
     protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final ArrayList<UserModel> item = new ArrayList<>();
        listView = (ListView) findViewById(R.id.list_view);


            item.add(new UserModel(false, R.string.name0, R.string.atk0, R.string.stat0,false));
            item.add(new UserModel(false, R.string.name1, R.string.atk1, R.string.stat1,false));
            item.add(new UserModel(false, R.string.name2, R.string.atk2, R.string.stat2,false));
            item.add(new UserModel(false, R.string.name3, R.string.atk3, R.string.stat3,false));
            item.add(new UserModel(false, R.string.name4, R.string.atk4, R.string.stat4,false));
            item.add(new UserModel(false, R.string.name5, R.string.atk5, R.string.stat5,false));
            item.add(new UserModel(false, R.string.name6, R.string.atk6, R.string.stat6,false));
            item.add(new UserModel(false, R.string.name7, R.string.atk7, R.string.stat7,false));

            Log.d(msg, "Made UserModel List with size: " + item.size());


        final CustomAdapter adapter = new CustomAdapter(this, item);
        listView.setAdapter(adapter);


        listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l) {
                Log.d(msg,"Item " + i + " was long clicked!");

                UserModel model = item.get(i);

                if(model.isFavorite()) {
                    model.setFavorite(false);
                    Log.d(msg, "Item " + i + " was removed as Favorite!");
                    Toast.makeText(view.getContext(),  model.getUserName() + i + " was removed from Favorites!", Toast.LENGTH_SHORT).show();
                } else {
                    model.setFavorite(true);
                    Log.d(msg, "Item " + i + " was added as Favorite!");
                    Toast.makeText(view.getContext(),model.getUserName() + i + " was added to Favorites!",Toast.LENGTH_SHORT).show();
                }

                item.set(i, model);

                adapter.updateRecords(item);

                Gson gson = new Gson();
                String json = gson.toJson(item);

                Log.d(msg, "Here is the json file: " + json);


                return model.isFavorite();
                }
        });


        listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){

            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {

                Log.d(msg, "Item " + (i) + " was clicked!");
                UserModel model = item.get(i);


                if (model.isSelected())
                    model.setSelected(false);
                else
                    model.setSelected(true);
                    Log.d(msg, "Item " + (i) + " " + model.isSelected());

                item.set(i, model);

                //now update adapter
                adapter.updateRecords(item);

                Gson gson = new Gson();
                String json = gson.toJson(item);

                Log.d(msg, "Here is the json file: " + json);

            }



        });

    }

}

标签: androidjsonlistviewarraylistdata-retrieval

解决方案


假设我理解你的问题,这里是你如何加载 json 数据onCreate

ArrayList<UserModel> items = new ArrayList<>();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    //Load json to string from the file you saved it in
    ...
    String rawJson = "...";

    //Parse data to your list
    ...
    items = gson.fromJson(br, new TypeToken<List<UserModel>>(){}.getType());
}

但是,我建议您考虑将数据存储在本地数据库中,因为它更易于更新和管理。将 json 存储在文件中非常难看。

您可以将库签出为Room


推荐阅读