【问题标题】:Create ListView with HashMap - using local JSON file使用 HashMap 创建 ListView - 使用本地 JSON 文件
【发布时间】:2013-12-04 20:38:26
【问题描述】:
public class MainActivity extends ListActivity {

  protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ArrayList<Map<String, String>> list = buildData();
        String[] from = { "Name", "Entry" };
        int[] to = { android.R.id.text2, android.R.id.text1 };

        SimpleAdapter adapter = new SimpleAdapter(this, list,
            android.R.layout.simple_list_item_2, from, to);
        setListAdapter(adapter);
      }

      private ArrayList<Map<String, String>> buildData() {
        ArrayList<Map<String, String>> list = 
                new ArrayList<Map<String, String>>();


        list.add(putData("Bulbasaur", "001"));
        list.add(putData("Ivysaur", "002"));
        list.add(putData("Venusaur", "003"));


        return list;
      }

      private HashMap<String, String> putData(String name, String entry) {

          HashMap<String, String> item = new HashMap<String,
                  String>();
          item.put("Name", name);
          item.put("Entry", entry);
        return item;
      }

我的目标是在上面列出的 putData 或 buildData 类中添加 JSON 引用。我有另一个类(如下),我将使用它来引用本地存储的 JSON 文件。

public String loadJSONFromAsset() {
    String json = null;
    try {

        InputStream is = getAssets().open("pokelist.json");

        int size = is.available();

        byte[] buffer = new byte[size];

        is.read(buffer);

        is.close();

        json = new String(buffer, "UTF-8");


    } catch (IOException ex) {
        ex.printStackTrace();
        return null;
    }
    return json;

}

我遇到的问题是,无论我做什么,JSON 文件中的数据都不会显示在 ListActivity 中。我知道 ListActivity 有效,但我不完全确定应该如何使用 JSON 文件中的数据实现 HashMap。

谁能给我一些指导。 请不要提供链接;我整天都在到处寻找有关此事的某种形式的例子,但无济于事。 我可以使用一些我能理解的帮助。

澄清 我想要做的是从 HDD 加载 JSON 文件,并将键值放入 HashMap;然后将显示在我的 ListView(列表)中。

JSON 代码:

{
  "pokemon": [
  {"Entry":"001", 
   "Name":"Bulbasaur", "Type":"1"},
  {"Entry":"002", 
  "Name":"Ivysaur" , "Type":"1"},
  {"Entry":"003",
   "Name":"Venusaur", "Type":"1"}
  ]
}

最近的日志消息

12-04 22:00:53.652:E/Trace(2093):打开跟踪文件时出错:没有这样的文件或目录 (2) 12-04 22:00:53.712: W/System.err(2093): java.io.FileNotFoundException: pokelist.json 12-04 22:00:53.763:W/System.err(2093):在 android.content.res.AssetManager.openAsset(本机方法) 12-04 22:00:53.763: W/System.err(2093): 在 android.content.res.AssetManager.open(AssetManager.java:315) 12-04 22:00:53.796: W/System.err(2093): 在 android.content.res.AssetManager.open(AssetManager.java:289) 12-04 22:00:53.796: W/System.err(2093): 在 com.example.myjsonproject.MainActivity.loadJSONFromAsset(MainActivity.java:78) 12-04 22:00:53.796: W/System.err(2093): 在 com.example.myjsonproject.MainActivity.buildData(MainActivity.java:44) 12-04 22:00:53.796: W/System.err(2093): 在 com.example.myjsonproject.MainActivity.onCreate(MainActivity.java:27) 12-04 22:00:53.796: W/System.err(2093): 在 android.app.Activity.performCreate(Activity.java:5104) 12-04 22:00:53.796: W/System.err(2093): 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080) 12-04 22:00:53.796: W/System.err(2093): 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144) 12-04 22:00:53.796: W/System.err(2093): 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 12-04 22:00:53.796: W/System.err(2093): 在 android.app.ActivityThread.access$600(ActivityThread.java:141) 12-04 22:00:53.803: W/System.err(2093): 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 12-04 22:00:53.836: W/System.err(2093): 在 android.os.Handler.dispatchMessage(Handler.java:99) 12-04 22:00:53.836: W/System.err(2093): 在 android.os.Looper.loop(Looper.java:137) 12-04 22:00:53.836: W/System.err(2093): 在 android.app.ActivityThread.main(ActivityThread.java:5041) 12-04 22:00:53.836: W/System.err(2093): at java.lang.reflect.Method.invokeNative(Native Method)

谢谢。

【问题讨论】:

  • 澄清一下:你想从磁盘加载一个 JSON 文件,读入它的值,然后将它的 key:value 对放入 HashMap,对吗?
  • 你能把json内容粘贴到这里吗,因为json需要转换成JsonArray对象然后迭代该数组来构建hashmap列表。
  • @mttdbrd 是的,这正是我想要做的。我现在会更新我的帖子。

标签: android json listview hashmap


【解决方案1】:

您可以尝试以下方法:

JSONObject jj = new JSONObject(loadJSONFromAsset());

            JSONArray jsonArray = jj.getJSONArray("pokemon");

            for(int i = 0; i< jsonArray.length();i++) {
                JSONObject ii = jsonArray.getJSONObject(i);

                list.add(putData(ii.getString("Name"),   ii.getString("Entry")));

            }

读取json的函数

public String loadJSONFromAsset() {
                InputStream is = getApplicationContext().getAssets().open("pokelist.json");
        int size = is.available();
        buffer = new byte[size];
        is.read(buffer);
        is.close();
        String bufferString = new String(buffer);
            return bufferString ;
}

从这些行中可以清楚地看出,您的项目的资产文件夹中缺少文件。

12-04 22:00:53.652: E/Trace(2093): error opening trace file: No such file or directory (2) 12-04 22:00:53.712: W/System.err(2093): java.io.FileNotFoundException: pokelist.json 12-04 22:00:53.763:

【讨论】:

  • OP:澄清一下,这将被投入尝试和捕捉?
  • @Inafune 是的,使用 try catch,我写的答案没有任何“IDE”:)
  • @Inafune 编辑了答案第一行以从您创建的函数中加载。
  • 我在执行时得到的只是一个空白屏幕。这就是我之前尝试自己做的事情。
  • @Inafune 尝试使用断点并调查变量值。
猜你喜欢
  • 2014-01-17
  • 2021-10-27
  • 2023-01-22
  • 1970-01-01
  • 2015-10-27
  • 2018-05-22
  • 2023-03-22
  • 2014-11-27
  • 2018-01-10
相关资源
最近更新 更多