3

我有超过 10000 个城市名称,我想在 ListView 中显示。我将这些名称存储为 city.xml 文件res/values folder

像下面

<resources>
<string-array name="city"> 
<item>  chennai, India </item>
<item>  Spring Creek , Australia </item>
.
.

然后我创建一个 ArrayAdapter 并像这样填充到 listView 。

String[] cityDetails = res.getStringArray(R.array.city); // <-- getting Error in this line
myAdapter = new ArrayAdapter<String>(this, R.layout.ap_details_row, R.id.aNameTV, cityDetails );
myLV.setAdapter(myAdapter);

它在 API 级别 13 及更高级别的设备中运行良好。但在 API 级别 13 设备以下,我收到以下错误。

 W/dalvikvm(306): ReferenceTable overflow (max=512)
 W/dalvikvm(306): Last 10 entries in JNI local reference table:
  W/dalvikvm(306):   502: 0x45fbb330 cls=Ljava/lang/String; (28 bytes)
  W/dalvikvm(306):   503: 0x45fbb388 cls=Ljava/lang/String; (28 bytes)
  W/dalvikvm(306):   504: 0x45fbb3e0 cls=Ljava/lang/String; (28 bytes)
  W/dalvikvm(306):   505: 0x45fbb438 cls=Ljava/lang/String; (28 bytes)
  W/dalvikvm(306):   506: 0x45fbb498 cls=Ljava/lang/String; (28 bytes)
  W/dalvikvm(306):   507: 0x45fbb4f8 cls=Ljava/lang/String; (28 bytes)
  W/dalvikvm(306):   508: 0x45fbb558 cls=Ljava/lang/String; (28 bytes)
  W/dalvikvm(306):   509: 0x45fbb5d0 cls=Ljava/lang/String; (28 bytes)
  W/dalvikvm(306):   510: 0x45fbb638 cls=Ljava/lang/String; (28 bytes)
  W/dalvikvm(306):   511: 0x45fbb698 cls=Ljava/lang/String; (28 bytes)
  W/dalvikvm(306): JNI local reference table summary (512 entries):
  W/dalvikvm(306):     3 of Ljava/lang/Class; 164B (2 unique)
  W/dalvikvm(306):   507 of Ljava/lang/String; 28B (507 unique)
  W/dalvikvm(306):     1 of [Ljava/lang/String; 28B
  W/dalvikvm(306):     1 of [Ljava/lang/String; 37436B
  W/dalvikvm(306): Memory held directly by tracked refs is 51988 bytes
  E/dalvikvm(306): Failed adding to JNI local ref table (has 512 entries)
  I/dalvikvm(306): "main" prio=5 tid=1 RUNNABLE
  I/dalvikvm(306):   | group="main" sCount=0 dsCount=0 s=N obj=0x4001d8e0 self=0xccb0
  I/dalvikvm(306):   | sysTid=306 nice=0 sched=0/0 cgrp=default handle=-1345026008
  I/dalvikvm(306):   | schedstat=( 1050455605 562911400 652 )
  I/dalvikvm(306):   at android.content.res.AssetManager.getArrayStringResource(Native Method)
  I/dalvikvm(306):   at android.content.res.AssetManager.getResourceStringArray(AssetManager.java:186)
  I/dalvikvm(306):   at android.content.res.Resources.getStringArray(Resources.java:381)
  I/dalvikvm(306):   at com.mypro.main.HomeActivity.onCreate(HomeActivity.java:184)
 I/dalvikvm(306):   at dalvik.system.NativeStart.main(Native Method)
 E/dalvikvm(306): VM aborting

任何帮助,将不胜感激。

4

6 回答 6

3

一些想法:

1-一次显示一页数据。向下滚动时,加载更多数据。

2- 滚动 10000 条记录到最后需要很长时间。通过搜索表单访问您的数据。将结果限制为 100 条记录。

3- 如果数据已排序,则将项目组合在一起并提供索引。例如,按字母顺序排列的列表可以分成 26 个子集。第一页显示字母表,您必须单击一个字母才能转到一个子集。

于 2013-09-06T11:00:39.963 回答
3

最好的办法是使用Base Adapter...懒加载~~~

于 2013-09-06T11:01:16.203 回答
2

我认为您必须使用“ AutoCompleteText”而不是“ ListView”,因为最终用户很容易从更多数据中找到城市。

于 2013-09-06T11:02:39.547 回答
2

显示包含 10 000 个城市名称的列表视图不是一个好习惯。您应该考虑使用另一种方法。

例如,看看AutoCompleteTextView

于 2013-09-06T11:06:13.483 回答
1

另一个想法是将这些值插入到 sqlite 数据库中并使用 CursorLoader 访问它们。游标将处理所有数据的内存管理。

这是关于 Android 上 SQLite 的精彩教程:http ://www.vogella.com/articles/AndroidSQLite/article.html

于 2013-10-23T23:10:36.317 回答
1

以下方法在所有 API 级别都运行良好。

     ArrayList<String> namelist = null;
        try {

             AssetManager am = activity.getAssets();
             InputStream is = am.open("city_name_list.txt");
             Scanner inStream = new Scanner(is);
             namelist = new ArrayList<String>();

            while(inStream.hasNextLine()){
                    namelist.add(inStream.nextLine());
            }
        } catch (IOException e) {

        }
于 2013-10-24T03:44:10.590 回答