2017-01-06 11 views
-2

ListView отправляет намерение в действие musicplayer Activity. Намерения содержат целые значения, используемые для решения песен и он работает нормально для небольшого числа элементов в скажу список воспроизведения (а ListView), но для большого количества песен, он выходит из строя (показано Вход ниже): ListView:NullPointerException из-за большого размера массива

final int size = lv.getAdapter().getCount(); 
    final String[] F= new String[size]; 
    final int Q[] = new int[size]; 
    // listening to single listitem click 
    lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> parent, View view, 
           int position, long id) { 
      // getting listitem index 
      TextView textView = (TextView) view.findViewById(android.R.id.text1); 
      String songName = textView.getText().toString();//lv.getItemAtPosition(position).toString(); 

      Queuer(F,Q,size); 
      //songIndex = manager.getSongIndex(songName, getApplicationContext()); 
      // Starting new intent 
      Intent i = new Intent(getApplicationContext(), MusicPlayerActivity.class); 
      Log.d("TAG", "onItemClick"); 
      //// Sending songIndex to PlayerActivity 
      i.putExtra("size",size); 
      i.putExtra("queue",Q); 
      i.putExtra("filtered",true); 
      // Toast.makeText(getApplicationContext(), "Qi:" + Q[0], Toast.LENGTH_LONG).show(); 
      i.putExtra("start", position); 
      startActivityForResult(i, 7); 
     } 
    }); 

метод организации очередей для хранения имен и индексы песен в массивах

void Queuer(String[] F,int[] Q, int size){ 
     for(int i=0;i<size;i++){ 
      View v = getListView().getChildAt(i); 
      TextView tv= (TextView) v.findViewById(android.R.id.text1); 
      F[i] = tv.getText().toString(); 
      Q[i] = manager.getSongIndex(F[i],getApplicationContext()); 
      Toast.makeText(getApplicationContext(), "SongName:" + F[i] , Toast.LENGTH_LONG).show(); 
     } 
    } 

Вход:

01-07 00: 03: 50,293 27292-27292/com.imhotep.musicplayer Х/AndroidRuntime: неустранимое: Основной процесса: com.imhotep.musicplayer, ПИД: 27292 java.lang.NullPointerException: Попытка чтобы вызвать виртуальный метод 'android.view.View android.view.View.findViewById (INT)' на ссылки объекта на нуль com.imhotep.musicplayer.FilteredTracksActivity.Queuer (FilteredTracksActivity.java:307) в com.imhotep.musicplayer.FilteredTracksActivity $ 4.onItemClick (FilteredTracksActivity.java:285) на android. widget.AdapterView.performItemClick (AdapterView.java:310) на android.widget.AbsListView.performItemClick (AbsListView.java:1213) на android.widget.AbsListView $ PerformClick.run (AbsListView.java:3256) на android. widget.AbsListView $ 3.run (AbsListView.java:4190) на android.os.Handler.handleCallback (Handler.java:815) на android.os.Handler.dispatchMessage (Handler.java:104) на android.os .Looper.loop (Looper.java:194) на android.app.ActivityThread.main (ActivityThread.java:5706) на java.lang.reflect.Method.invoke (собственный метод) на java.la ng.reflect.Method.invoke (Method.java:372) at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:1033) at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:828)

Нужна помощь в этом. код Adapter:

 String[] columns = {MediaStore.Audio.Media.DATA, 
       MediaStore.Audio.Media._ID, MediaStore.Audio.Media.TITLE, 
       MediaStore.Audio.Media.DISPLAY_NAME, 
       MediaStore.Audio.Media.MIME_TYPE}; 

     String where = android.provider.MediaStore.Audio.Media.ARTIST + "=?"; 
     String whereVal[] = { s }; 
     String orderBy = android.provider.MediaStore.Audio.Media.TITLE; 
     Cursor cursor = getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, 
       columns, where, whereVal, orderBy); 

     //Cursor cursor = getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, 
     //  new String[]{MediaStore.Audio.Media._ID,MediaStore.Audio.Media.TITLE}, where, whereVal, orderBy); 

     String[] displayFields = new String[]{MediaStore.Audio.Media.TITLE}; 
     int[] displayViews = new int[]{android.R.id.text1}; 

     ListAdapter adapter = new SimpleCursorAdapter(this, 
       android.R.layout.simple_list_item_1, cursor, displayFields, 
       displayViews, 0); 
     setListAdapter(adapter); 
+2

Он сообщает вам, где именно проблема. Поскольку вы используете «ListView», ваши представления повторно используются. Вам нужно использовать «ViewHolder», чтобы получить нужные результаты. http://stackoverflow.com/a/19289890/1269953 – Pztar

+0

'NullPointerException из-за большого размера массива' ** NO **. NPE ** всегда ** из-за объекта, на который ссылались, но не были установлены. –

ответ

2

Это происходит потому, что ListView перерабатывает представления элементов для экономии памяти. Итак, вы можете получить доступ к уже имеющимся представлениям. По этой причине, если вы хотите распечатать все песни в своем списке воспроизведения (которые должны совпадать с вашим ListView?), Вы должны получить объекты данных из адаптера. Оттуда вы можете напрямую обращаться к объектным данным, а не к объектам представлений.

+0

Я думал о том же самом, но я не смог найти/найти-на-SO способ хранения объектов из ListAdapter непосредственно в массив String ... – Amenhotep

+0

решил? если не опубликовать ваш код адаптера, пожалуйста, – firegloves

+0

хорошо. Вот код ListAdapter с указателем, который его связывает. – Amenhotep

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