2013-02-22 3 views
1

У меня есть таблица DB с 10 000 строк, которые я хочу отобразить в списке. Я хочу отображать первые 20, и когда пользователь прокручивается до последнего элемента, должны загружаться следующие 20 (и т. Д.). это действительно занимает много времени, чтобы загрузить все в ДАННЫЕ ListView так вот почему я хочу, чтобы загрузить 20 Datas первый ..Listview using Endless adapter

внутри OnCreate() Метод код:

dbHelper = new WordDbAdapter(this); 
    dbHelper.open(); 

    //Generate ListView from SQLite Database 
    displayListView(); 

затем метод displayListView() код выглядит так:

@SuppressWarnings("deprecation") 
private void displayListView() { 


    final Cursor cursor = dbHelper.fetchAllWords(); 

    // The desired columns to be bound 
    String[] columns = new String[] { 
      WordDbAdapter.KEY_WORD, 
      WordDbAdapter.KEY_ROWID, 

    }; 

    // the XML defined views which the data will be bound to 
    int[] to = new int[] { 

    R.id.Word, 
    R.id.imgStar, 

    }; 

    // create the adapter using the cursor pointing to the desired data 
    //as well as the layout information 
    dataAdapter = new SimpleCursorAdapter(
    this, R.layout.word_info, 
    cursor, 
    columns, 
    to 
    ); 

    ListView listView = (ListView) findViewById(R.id.Diclist); 
    // Assign adapter to ListView 
    listView.setAdapter(dataAdapter); 
listView.setOnScrollListener(new OnScrollListener(){ 
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 
     int lastInScreen = firstVisibleItem + visibleItemCount; 
     if(cursor != null){ 

      if(lastInScreen == totalItemCount && isLoadingMore == false){ 
       isLoadingMore = true; 

       loadedPage ++; 
       new LoadWords().execute(); 
      } 
     } 
    } 
    public void onScrollStateChanged(AbsListView view, int scrollState) {} 
}); 




    listView.setOnItemClickListener(new OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> listView, View view, 
    int position, long id) { 
    // Get the cursor, positioned to the corresponding row in the result set 
    Cursor cursor = (Cursor) listView.getItemAtPosition(position); 


    // Get the word name from this row in the database. 
     String wordSelected = 
       cursor.getString(cursor.getColumnIndexOrThrow("word")); 
     String wordSyllabication = 
       cursor.getString(cursor.getColumnIndexOrThrow("syllabication")); 
     String wordPartofSpeech = 
       cursor.getString(cursor.getColumnIndexOrThrow("partofspeech")); 
     String wordMeaning = 
       cursor.getString(cursor.getColumnIndexOrThrow("meaning")); 
     String wordSpeak = 
       cursor.getString(cursor.getColumnIndexOrThrow("speakword")); 

     EditText TextDic = (EditText) findViewById(R.id.TextDic); 
     TextDic.setText(wordSelected); 
     speakMeaning = wordMeaning; 
     speakSyllabication = wordSyllabication; 
     speakPartOfSpeech = wordPartofSpeech; 
     speakWord = wordSpeak; 
     speakGetWord = wordSelected; 


     //Toast.makeText(getApplicationContext(), 
      // wordSyllabication + "\n" + wordPartofSpeech + "\n" + wordMeaning , Toast.LENGTH_SHORT).show(); 

     } 
     }); 



    EditText TextDic = (EditText) findViewById(R.id.TextDic); 
    TextDic.addTextChangedListener(new TextWatcher() { 

    public void afterTextChanged(Editable s) { 
    speakWord = ""; 
    speakMeaning = ""; 

    } 

    public void beforeTextChanged(CharSequence s, int start, 
    int count, int after) { 
    } 

    public void onTextChanged(CharSequence s, int start, 
    int before, int count) { 
    dataAdapter.getFilter().filter(s.toString()); 
    } 
    }); 

    dataAdapter.setFilterQueryProvider(new FilterQueryProvider() { 
     public Cursor runQuery(CharSequence constraint) { 
     return dbHelper.fetchWordsByWord(constraint.toString()); 
     } 
    }); 


    } 

тогда мой AsyncTask как это:

private class LoadWords extends AsyncTask<String, Void, Void> { 
    private final ProgressDialog dialog = new ProgressDialog(DictionaryActivity.this); 

    Cursor cursor = dbHelper.fetchAllWords(); 

    @Override 
    protected void onPreExecute() { 
     this.dialog.setMessage("Loading books..."); 
     this.dialog.show(); 
    } 

    public void execute() { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    protected Void doInBackground(String... arg0) { 
     try{ 
      cursor = dbHelper.fetchAllWords(); 
     }catch(Exception e){ 
      e.printStackTrace(); 
     } 
     return null; 
    } 
    @SuppressWarnings("deprecation") 
    @Override 
    protected void onPostExecute(final Void unused){ 
     if(cursor != null){ 
      if(dataAdapter == null){ 
       startManagingCursor(cursor); 
       String[] columns = new String[] { 
          WordDbAdapter.KEY_WORD, 
          WordDbAdapter.KEY_ROWID, 

        }; 
       int[] to = new int[] { 

         R.id.Word, 
         R.id.imgStar, 

         }; 
       getListView().setTranscriptMode(ListView.TRANSCRIPT_MODE_NORMAL); 
       dataAdapter = new SimpleCursorAdapter(DictionaryActivity.this, R.layout.word_info, cursor, columns, to); 
       ListView listView = (ListView) findViewById(R.id.Diclist); 
        // Assign adapter to ListView 
       listView.setAdapter(dataAdapter); 


      }else{ 
       dataAdapter.notifyDataSetChanged(); 
      } 
     } 
     if(dialog != null && dialog.isShowing()){ 
      dialog.dismiss(); 
     } 
     isLoadingMore = false; 
    } 

    private AbsListView getListView() { 
     // TODO Auto-generated method stub 
     return null; 
    } 
} 

ответ

2

Адаптер не загружает все сразу, и это не должно быть причиной того, что вы видите низкую производительность. ListView и SimpleCursorAdapter полностью способны прокручивать список из 10 000 элементов. Адаптер загружает только элементы, когда пользователь прокручивает список. Из кода, который вы в курсе, я бы сказал, что ваши проблемы производительности приходят от

dbHelper.deleteAllWords(); 
dbHelper.insertSomeWords(); 

Если вы разместите код для этих методов и dbHelper.fetchAllWords(), возможно, мы можем предложить больше помощи. Кроме того, вы можете решить проблемы с пользовательским интерфейсом, выполнив эти длительные задачи в фоновом потоке (проверьте AsyncTask) и используя ProgressDialog, чтобы информировать пользователя о том, что происходит.

+0

ive уже отредактировал мой код, но все еще требуется 5 минут для загрузки списка ... hmmm ... thanks BTW .. – Jin

+0

Вы итерации через курсор в fetchAllWords()? Кстати, в отредактированном коде вы дважды вызываете fetchAllWords(), один раз в инициализации курсора и один раз в фоновом потоке. – Samuel

2

Посмотрите на Endless Adapter от великого Марка Мерфи. Это делает его очень легким. У вас будет набор данных, содержащий только те элементы, которые вы показываете. В адаптере вы можете сказать ему, чтобы захватить следующий набор из вашей базы данных и добавить его в набор данных.