2013-09-06 2 views
3

У меня более 10000 названий городов, и я хочу показать в ListView. Я сохранил эти имена, как city.xml файл в res/values folderJNI локальная таблица справочной таблицы (512 записей)

, как показано ниже

<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 

Любая помощь будет принята с благодарностью.

ответ

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) { 

     } 
3

Несколько идей:

1- Отображение данных по одной странице за раз. Когда вы прокрутите вниз, загрузите больше данных.

2- Прокрутка по 10000 записей, чтобы пройти до конца, будет навсегда. Получите доступ к своим данным через форму поиска. Ограничить результаты до 100 записей.

3- Если данные сортируются, группируйте элементы вместе и укажите индекс. Например, алфавитные списки можно разделить на 26 подмножеств. На первой странице показан алфавит, и вам нужно щелкнуть по букве, чтобы перейти к подмножеству.

3

Лучший способ заключается в использовании базы адаптера ... Он загружает лениво ~~~

2

Я думаю, вы должны использовать «AutoCompleteText», а затем «ListView», потому что конечный пользователь легко найти город с более подробной информации ,

2

Это Неправильная практика, чтобы показать список с 10 000 наименований городов. Вы должны использовать другой подход.

Например, обратите внимание на AutoCompleteTextView.

+0

Тогда я не понимаю, почему ваш пользователь хочет увидеть 10000 названий городов. Каков ваш прецедент или мотивация для этого? – hendrix

1

Еще одна мысль заключалась в том, чтобы вставить эти значения в базу данных sqlite и получить к ним доступ с помощью CursorLoader. Курсор будет обрабатывать управление памятью всех данных.

Вот отличный учебник по SQLite на Android: http://www.vogella.com/articles/AndroidSQLite/article.html

Смежные вопросы