【问题标题】:Android - Retrive particular line or lable from text file and display on a list View?Android - 从文本文件中检索特定行或标签并显示在列表视图中?
【发布时间】:2015-10-09 13:01:51
【问题描述】:

我有一个文本文件,我能够阅读全部内容并将其显示在视图中。

示例文件:http://pastebin.com/yCmpJfG0

但我的要求是我需要从字段名称中获取特定数据。 例如,我需要从"Label_1" 中检索Name_1address_1Phone_1,然后在单独的list view 上显示。然后是label_2 值等等。

【问题讨论】:

标签: android android-listview text-files


【解决方案1】:

有不同的方法可以解决这个问题,这不是安卓问题。以下代码可能会有用(将文本文件放入 res\raw 文件夹,例如 res\raw\test.txt):

(您可以在LINK 中尝试类似的代码)

    final String PHONE = "PHONE";
    final String ADDRESS = "ADDRESS";
    final String NAME = "NAME";

    InputStream in_s = getResources().openRawResource(R.raw.test);
    byte[] b = "".getBytes();
    try {
        b = new byte[in_s.available()];
        in_s.read(b);
    } catch (IOException ex) {
        System.out.println("Error!");

    }
    String[] words = (new String(b)).replace(":: label_", "").split("\\n");
    HashMap<Integer, HashMap<String, String>> h1 = new HashMap<Integer, HashMap<String, String>>();
    int groupNumber = 1;
    for (int i = 0; i < words.length; i++) {
        String str = words[i];
        if (!str.isEmpty()) {
            if (str.equals(String.valueOf(groupNumber))) {
                HashMap<String, String> h2 = new HashMap<String, String>();
                h1.put(groupNumber, h2);
            } else {
                h1.get(groupNumber).put(PHONE, words[i]);
                h1.get(groupNumber).put(ADDRESS, words[++i]);
                h1.get(groupNumber).put(NAME, words[++i]);
                groupNumber++;
            }
        }
    }
    System.out.println(h1);

这段代码显示了一个哈希图:

{1={NAME=<PHONE_1>, ADDRESS=[ADDRESS_1], PHONE=[NAME_1]}, 3={NAME=<PHONE_3>, ADDRESS=[ADDRESS_3], PHONE=[NAME_3]}, 2={NAME=<PHONE_2>, ADDRESS=[ADDRESS_2], PHONE=[NAME_2]}}

您可以通过以下方式获取值:

h1.get(1).get(PHONE);//this returns de phone value from group 1

此代码仅适用于您的文本文件(但您可以更改其他结构):

:: label_1
[NAME_1]
[ADDRESS_1]
<PHONE_1>

:: label_2
[NAME_2]
[ADDRESS_2]
<PHONE_2>

:: label_3
[NAME_3]
[ADDRESS_3]
<PHONE_3>

(已编辑) 假设文字是http://pastebin.com/fPDm72fe,我改了一段代码:

String[] words = (new String(b)).split("\\n");
    HashMap<Integer, HashMap<String, String>> h1 = new HashMap<Integer, HashMap<String, String>>();
    int groupNumber = 1;

for (int i = 0; i < words.length; i++) {
    String str = words[i];

    if (!str.trim().isEmpty()) {
        if(str.contains("::")){
            HashMap<String, String> h2 = new HashMap<String, String>();
            h1.put(groupNumber, h2);
        } else {
            h1.get(groupNumber).put(PHONE, words[i]);
            h1.get(groupNumber).put(ADDRESS, words[++i]);
            h1.get(groupNumber).put(NAME, words[++i]);
            groupNumber++;
        }
    }    
}

你可以试试他的here

【讨论】:

  • 感谢您的解决方案。但在我的例子中,我们不会有 Label_1、Name_1、Address_1 和 Phone_1。 txt 文档有一个没有任何标签的直接值。这就是我为标签名称添加不同数字的原因。所以每一行都有不同的名称和地址。
  • 我在下面添加了一个示例文本结构,它会清楚地说明。 pastebin.com/fPDm72fe
  • @vishnupalanivelM 好的,为了解决这个问题,你必须有一定的结构来获取每个值,如你所说,如果每个标题都是“:: Carpenter”,那么获取组的唯一方法将搜索字符串“::”。这个对吗?我需要一个模式来确定每个组。
  • 感谢您的解决方案
  • 谢谢。我可以获得所有唯一 ID 的“::”标题值。但是我需要没有哈希映射的中间数据的详细信息。数据有时也在下一行。我的意思是,在某些情况下我有 5 行,在其他情况下有 8 行文本。所以我需要下面的所有行“::”直到下一个“::”
【解决方案2】:

我认为你应该使用 JSON:(但我是谁?)

[
    {
        "Name": "name_1",
        "Adress": "adress_1",
        "Phone": "phone_1"
    },
    {
        "Name": "name_2",
        "Adress": "adress_2",
        "Phone": "phone_2"
    },
    {
        "Name": "name_3",
        "Adress": "adress_3",
        "Phone": "phone_3"
    }
]

现在您可以使用 JSONArray 和 JSONObject 来检索项目!

ArrayList<Person> personList = new ArrayList<>();
try {
    JSONArray jArray = new JSONArray(json);

    for (int i = 0; i < jArray.length(); i++) {
        try {
            JSONObject oneObject = jArray.getJSONObject(i);
            String name = oneObject.getString("Name");
            String adress = oneObject.getString("Adress");
            String phone = oneObject.getString("Phone");
            personList.add(new Person(name, adress, phone));
        } catch (JSONException e) {
            // Oops
        }
    }
} catch (JSONException e) {
    e.printStackTrace();
}

您可以将列表中的人员用于 listView。

【讨论】:

  • 对不起!此文本文件是否始终采用该格式?然后您可以使用 BufferedReader 并读取每一行,使用 : : 作为分隔符?
  • 是的,每组在第一行都有凝视'::'。这意味着开始了一组新的细节。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-10
  • 2015-07-06
  • 1970-01-01
  • 2015-09-09
  • 1970-01-01
  • 1970-01-01
  • 2011-09-08
相关资源
最近更新 更多