Android Studio Java Recycler View problem.

Permalänk

Android Studio Java Recycler View problem.

Det är ganska mycket kod att gå igenom men skulle uppskatta hjälp.
Problemet är att min recycler view listener inte fungerar på de items jag lägger till efter de första 3 istället krashar det hela och man får upp ett error, jag la till error texten precis innan koden börjar. Varför gör den detta och vart är problemet, även hur kan jag smidigt få arrayn som skickas tillbaka från EditPlayList klassen att ersätta den orignala

int[] first_playlist_order = {1,2,5};

Jag har inte lyckats hitta lösningen om behöver ett par nya ögon som kan kolla över problemet, hoppas nån kan hjälpa till skulle uppskattas enormt då detta är mitt sista projekt i en Universitets kurs.

E/InputEventReceiver: Exception dispatching input event.
E/MessageQueue-JNI: Exception in MessageQueue callback: handleReceiveCallback
E/MessageQueue-JNI: java.lang.ArrayIndexOutOfBoundsException: length=3; index=3
at com.example.mediaplayertesting.MainActivity.mpPlayer(MainActivity.java:103)
at com.example.mediaplayertesting.MainActivity.access$100(MainActivity.java:22)
at com.example.mediaplayertesting.MainActivity$1.onItemClick(MainActivity.java:146)

public class MainActivity extends AppCompatActivity { private Spinner spinner; public MediaPlayer mp; public ArrayList<Song> songs; private MusicAdapter mainAdapter; private RecyclerView rvPlayList; private Button playOrPauseButton, nextButton, previousButton, editButton; public SongArchive songArchive; private String[] active_playlist; private int selectedSong, selectedPlayList; private int[] playlist_song_order; private String[] playListNames; public List<String> playListList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); playListList = new ArrayList<String>(); spinner = findViewById(R.id.playListSpinner); songArchive = new SongArchive(); songArchive.setSongTitles(); playListList.add("Playlist 1"); playListList.add("Playlist 2"); selectedSong = 0; int[] first_playlist_order = {1,2,5}; updatePlayList(first_playlist_order); addListener(); mpPlayer(selectedSong); spinner(); setUpRecyclerView(); addRecyclerViewListener(); } private void updatePlayList(int[] setPlayListOrder){ playlist_song_order = new int[setPlayListOrder.length]; for(int i = 0; i < setPlayListOrder.length; i++){ playlist_song_order[i] = setPlayListOrder[i]; } active_playlist = songArchive.getPlayList(playlist_song_order); } private void addNewPlayList(){ playListList.add("Create new playlist"); } private void setUpRecyclerView(){ int size = playlist_song_order.length; rvPlayList = findViewById(R.id.mainPlayListRecyclerView); songs = Song.createPlayList(0); for(int i = 0; i < size; i++){ songs.add(new Song(songArchive.getPrettySongTitles(playlist_song_order[i]), songArchive.getPrettySongLength(playlist_song_order[i]))); } mainAdapter = new MusicAdapter(songs); mainAdapter.setSmallOrLarge("large"); rvPlayList.setAdapter(mainAdapter); rvPlayList.setLayoutManager(new LinearLayoutManager(this)); } private void playOrPause(String buttonTag){ if(buttonTag.equals("play")){ System.out.println("Song playing: "+ active_playlist.length); playOrPauseButton.setTag("pause"); playOrPauseButton.setText(getString(R.string.pauseStr)); mp.start(); }if(buttonTag.equals("pause")){ playOrPauseButton.setTag("play"); playOrPauseButton.setText(getString(R.string.playStr)); mp.pause(); } } private void mpPlayer(int selected){ try{ if(mp.isPlaying()) { mp.pause(); } }catch(NullPointerException error){ System.out.println("NullPointerException"); } mp = MediaPlayer.create(getApplicationContext(), getResources().getIdentifier(active_playlist[selected], "raw",getPackageName())); selectedSong = selected; } private void nextOrPrevious(String buttonTag){ try{ if(mp.isPlaying()) { mp.pause(); } }catch(NullPointerException error){ System.out.println("NullPointerException"); } if(buttonTag.equals("next")){ if(selectedSong < songArchive.getNumberOfSongsInPlayList()){ selectedSong++; mpPlayer(selectedSong); } }if(buttonTag.equals("previous")){ if(selectedSong > 0){ selectedSong--; mpPlayer(selectedSong); } } } public void addListener() { playOrPauseButton = findViewById(R.id.playOrPauseButton); editButton = findViewById(R.id.editButton); nextButton = findViewById(R.id.nextButton); previousButton = findViewById(R.id.previousButton); playOrPauseButton.setOnClickListener(new InterfaceListener()); nextButton.setOnClickListener(new InterfaceListener()); previousButton.setOnClickListener(new InterfaceListener()); editButton.setOnClickListener(new InterfaceListener()); } private void addRecyclerViewListener(){ Context context = null; rvPlayList.addOnItemTouchListener( new RecyclerViewItemClickListener(null, rvPlayList, new RecyclerViewItemClickListener.OnItemClickListener() { @Override public void onItemClick(View view, int position) { System.out.println("Fast click"); mpPlayer(position); } @Override public void onLongItemClick(View view, int position) { view.setBackgroundColor(Color.GRAY); System.out.println("Long click"); } }) ); } private class InterfaceListener implements View.OnClickListener{ public void onClick(View caller){ String buttonTag = caller.getTag().toString(); if(buttonTag.equals("edit")){ openEditPlayList(); } nextOrPrevious(buttonTag); playOrPause(buttonTag); } } public void spinner(){ playListNames = new String[playListList.size()]; playListList.toArray(playListNames); ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, playListNames); arrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinner.setAdapter(arrayAdapter); spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { selectedPlayList = position; setUpRecyclerView(); } @Override public void onNothingSelected(AdapterView<?> parent) { } }); } public void openEditPlayList(){ String plTitle = "Playlist "+String.valueOf(playListNames.length); Intent intent = new Intent(this, com.example.mediaplayertesting.EditPlayList.class); intent.putExtra(EditPlayList.PARAM_PLAY_LIST_TITLE, plTitle); intent.putExtra(EditPlayList.PARAM_PLAYLIST, playlist_song_order); startActivityForResult(intent, 0); } public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); String returnTitle = data.getStringExtra(EditPlayList.RETURN_VALUE); int[] returnPLayListOrder = data.getIntArrayExtra(EditPlayList.RETURN_PLAY_LIST); for(int i = 0; i < returnPLayListOrder.length; i++){ System.out.println("Return play list order "+i+" "+returnPLayListOrder[i]); } updatePlayList(returnPLayListOrder); spinner(); System.out.println("Return test: "+ returnTitle); } }

public class SongArchive { private final String Bensound_Epic = "bensoundepic"; private final String Bensound_Sunny = "bensoundsunny"; private final String Bensound_Energy = "bensoundenergy"; private final String Calm_Piano = "calmpiano"; private final String Cinematic_Chill_Hop = "cinematicchillhop"; private final String Epic_Travel = "epictravel"; private String[] songTitles; private String[] prettySongTitles; private String[] prettySongLength; private int numberOfSongsInArchive, numberOfSongsInPlayList; public void setSongTitles(){ songTitles = new String[]{Bensound_Energy, Bensound_Epic, Bensound_Sunny, Calm_Piano, Cinematic_Chill_Hop, Epic_Travel}; prettySongTitles = new String[]{"Bensound Energy","Bensound Epic","Bensound Sunny","Calm Piano","Cinematic Chill Hop","Epic Travel"}; prettySongLength = new String[] {"2:59","2:58","2:20","1:26","3:03","1:00"}; numberOfSongsInArchive = songTitles.length; } public String getPrettySongTitles(int get){ return prettySongTitles[get]; } public int getNrOfSongs(){ return songTitles.length; } public String getPrettySongLength(int get){ return prettySongLength[get]; } public String[] getPlayList(int[] songs){ List<String> localList = new ArrayList<String>(); int j = 0; for(int i = 0; i < numberOfSongsInArchive; i++){ if(songs[j] == i){ localList.add(songTitles[i]); j++; } } setNumberOfSongsInPlayList(j); String[] localArray = new String[localList.size()]; localList.toArray(localArray); return localArray; } public void setNumberOfSongsInPlayList(int number){ numberOfSongsInPlayList = number; } public int getNumberOfSongsInPlayList(){ if(numberOfSongsInPlayList == 0){ return 0; }else return numberOfSongsInPlayList-1; } }

public class Song { private String songName; private String songDuration; public Song(String song_name, String song_duration){ songName = song_name; songDuration = song_duration; } public String getSongName() { return songName; } public String getSongDuration() { return songDuration; } public static ArrayList<Song> createPlayList(int numSongs){ ArrayList<Song> songs = new ArrayList<>(); for(int i = 0; i <= numSongs; i++){ } return songs; } }

public class EditPlayList extends AppCompatActivity { MusicAdapter adapter1, adapter2; ArrayList<Song> songs; public SongArchive songArchive; public Button addButton, removeButton, backButton; public EditText titleEditView; private RecyclerView playListRecyclerView, allSongRecyclerView; public static final String PARAM_PLAY_LIST_TITLE = "title"; public static final String RETURN_VALUE = "return"; public static final String PARAM_PLAYLIST = "PlayList"; public static final String RETURN_PLAY_LIST = "return playlist"; private int[] playList; public ArrayList<Integer> playListList; public String playListTitle; private int size, songSelected; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.edit_playlist); songArchive = new SongArchive(); songArchive.setSongTitles(); playListTitle = this.getIntent().getStringExtra(PARAM_PLAY_LIST_TITLE); playList = this.getIntent().getIntArrayExtra(PARAM_PLAYLIST); titleEditView = findViewById(R.id.titleTextView); titleEditView.setText(playListTitle); playListList = new ArrayList<Integer>(); for(int i = 0; i < playList.length; i++){ playListList.add(playList[i]); } System.out.println("Size list: "+ playListList.size()); for(int i = 0; i < playList.length; i++){ System.out.println(playListList.get(i)); } size = playList.length; setUpRecyclerViewPlayListSongs(); addRecyclerViewListenerPlayList(); setUpRecyclerViewAllSongs(); addRecyclerViewListenerAll(); addListener(); } private void setUpRecyclerViewPlayListSongs(){ playListRecyclerView = findViewById(R.id.playListRecyclerView); songs = Song.createPlayList(0); for(int i = 0; i < size; i++){ songs.add(new Song(songArchive.getPrettySongTitles(playList[i]), songArchive.getPrettySongLength(playList[i]))); } adapter1 = new MusicAdapter(songs); adapter1.setSmallOrLarge("small"); playListRecyclerView.setAdapter(adapter1); playListRecyclerView.setLayoutManager(new LinearLayoutManager(this)); } private void setUpRecyclerViewAllSongs(){ int nrOf = songArchive.getNrOfSongs(); allSongRecyclerView = findViewById(R.id.allSongRecyclerView); songs = Song.createPlayList(0); for(int i = 0; i < nrOf; i++){ songs.add(new Song(songArchive.getPrettySongTitles(i), songArchive.getPrettySongLength(i))); } adapter2 = new MusicAdapter(songs); adapter2.setSmallOrLarge("small"); allSongRecyclerView.setAdapter(adapter2); allSongRecyclerView.setLayoutManager(new LinearLayoutManager(this)); } public void setSongSelected(int intSong){ songSelected = intSong; } public void addToPlayList(){ playListList.add(songSelected); setUpRecyclerViewPlayListSongs(); } public void removeFromPlayList(int remove){ playListList.remove(remove); } private void addRecyclerViewListenerAll(){ Context context = null; allSongRecyclerView.addOnItemTouchListener( new RecyclerViewItemClickListener(null, allSongRecyclerView, new RecyclerViewItemClickListener.OnItemClickListener() { @Override public void onItemClick(View view, int position) { view.setBackgroundColor(Color.WHITE); System.out.println("Fast click"); } @Override public void onLongItemClick(View view, int position) { view.setBackgroundColor(Color.GRAY); setSongSelected(position); } }) ); } private void addRecyclerViewListenerPlayList(){ Context context = null; playListRecyclerView.addOnItemTouchListener( new RecyclerViewItemClickListener(null, playListRecyclerView, new RecyclerViewItemClickListener.OnItemClickListener() { @Override public void onItemClick(View view, int position) { view.setBackgroundColor(Color.WHITE); System.out.println("Fast click"); } @Override public void onLongItemClick(View view, int position) { view.setBackgroundColor(Color.GRAY); setSongSelected(position); } }) ); } public void addListener() { addButton = findViewById(R.id.addSongButton); removeButton = findViewById(R.id.removeSongButton); backButton = findViewById(R.id.backButton); addButton.setOnClickListener(new InterfaceListener()); removeButton.setOnClickListener(new InterfaceListener()); backButton.setOnClickListener(new InterfaceListener()); } private class InterfaceListener implements View.OnClickListener{ public void onClick(View caller){ String buttonTag = caller.getTag().toString(); if(buttonTag.equals("back")){ goBack(); } if(buttonTag.equals("add")){ addToPlayList(); } if(buttonTag.equals("remove")){ removeFromPlayList(songSelected); } } } public void goBack(){ int[] temp = new int[playListList.size()]; for(int i = 0; i < temp.length; i++){ temp[i] = playListList.get(i); } for(int i = 0; i < temp.length; i++){ System.out.println("Temp: "+i+" "+temp[i]); } String returnTitle = titleEditView.getText().toString(); Intent returnIntent = new Intent(); returnIntent.putExtra(RETURN_VALUE, returnTitle); returnIntent.putExtra(RETURN_PLAY_LIST, temp); setResult(RESULT_OK, returnIntent); finish(); } }

public class MusicAdapter extends RecyclerView.Adapter<MusicAdapter.ViewHolder>{ private List<Song> songList; private ViewHolder viewHolder; public String smallOrLarge; public MusicAdapter(List<Song> songs){ songList = songs; } public void setSmallOrLarge(String smallOrLarge) { this.smallOrLarge = smallOrLarge; } @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { Context context = parent.getContext(); LayoutInflater inflater = LayoutInflater.from(context); if(smallOrLarge.equals("small")){ View songView = inflater.inflate(R.layout.song_model_small, parent, false); viewHolder = new ViewHolder(songView); } if(smallOrLarge.equals("large")){ View songView = inflater.inflate(R.layout.song_model_large, parent, false); viewHolder = new ViewHolder(songView); } return viewHolder; } @Override public void onBindViewHolder(@NonNull ViewHolder holder, int position) { Song song = songList.get(position); TextView songName = holder.songName; TextView songDuration = holder.songDuration; songName.setText(song.getSongName()); songDuration.setText(song.getSongDuration()); } @Override public int getItemCount() { return songList.size(); } public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{ public TextView songName, songDuration; public ViewHolder(View itemView){ super(itemView); songName = itemView.findViewById(R.id.songName); songDuration = itemView.findViewById(R.id.songDuration); itemView.setOnClickListener(this); } @Override public void onClick(View view){ int position = getAdapterPosition(); } } }

public class RecyclerViewItemClickListener implements RecyclerView.OnItemTouchListener { private OnItemClickListener mListener; public interface OnItemClickListener { public void onItemClick(View view, int position); public void onLongItemClick(View view, int position); } GestureDetector mGestureDetector; public RecyclerViewItemClickListener(Context context, final RecyclerView recyclerView, OnItemClickListener listener) { mListener = listener; mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() { @Override public boolean onSingleTapUp(MotionEvent e) { return true; } @Override public void onLongPress(MotionEvent e) { View child = recyclerView.findChildViewUnder(e.getX(), e.getY()); if (child != null && mListener != null) { mListener.onLongItemClick(child, recyclerView.getChildAdapterPosition(child)); } } }); } @Override public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) { View childView = view.findChildViewUnder(e.getX(), e.getY()); if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) { mListener.onItemClick(childView, view.getChildAdapterPosition(childView)); return true; } return false; } @Override public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) { } @Override public void onRequestDisallowInterceptTouchEvent (boolean disallowIntercept){} }

Visa signatur

Så jag kommer ihåg. [code][/code]

Permalänk
Medlem

Har inte läst igenom din kod och kan inget om android men föreslår att du sätter lite debug breakpoints om du inte har gjort det och noggrant följer de problematiska objektens resa.

Permalänk
Avstängd

Denna låter intressant

ArrayIndexOutOfBoundsException: length=3; index=3

i MainActivity.java på rad 103. Låter som om man försöker komma åt en plats i matrisen som befinner sig på en högre plats än vad det faktiskt finns.

EDIT: Slå även ett öga på updatePlayList funktionen. Den kan vara pappa till problemet eller så ligger problemet i variablen Selected när den nyttjas på rad 103.

Om problemet ligger i Selected så kolla vem som anropar mpPlayer funktionen. Risken är att antalet i matrisen är inte samma sak som positionen. D.v.s. om den jobbar så att antal är en sak men positionen startar på 0 så blir det fel om man går till låt 3 om den faktiska positionen i matrisen är plats 2 för låt nummer 3.

Kolla också att anropet mpPlayer(position); verkligen har samma positionsvärde som det som sedan används på rad 103.

Visa signatur

Grundregel för felsökning: Bryt och begränsa.

Permalänk
Skrivet av Veni:

Denna låter intressant

ArrayIndexOutOfBoundsException: length=3; index=3

i MainActivity.java på rad 103. Låter som om man försöker komma åt en plats i matrisen som befinner sig på en högre plats än vad det faktiskt finns.

EDIT: Slå även ett öga på updatePlayList funktionen. Den kan vara pappa till problemet eller så ligger problemet i variablen Selected när den nyttjas på rad 103.

Om problemet ligger i Selected så kolla vem som anropar mpPlayer funktionen. Risken är att antalet i matrisen är inte samma sak som positionen. D.v.s. om den jobbar så att antal är en sak men positionen startar på 0 så blir det fel om man går till låt 3 om den faktiska positionen i matrisen är plats 2 för låt nummer 3.

Kolla också att anropet mpPlayer(position); verkligen har samma positionsvärde som det som sedan används på rad 103.

Du låter smart så medans jag forstätter med detta problem lust och kolla på ett annat? Annan Sweclocker tråd om annat projekt

Visa signatur

Så jag kommer ihåg. [code][/code]

Permalänk
Avstängd
Skrivet av MaskenLilja:

Du låter smart så medans jag forstätter med detta problem lust och kolla på ett annat? Annan Sweclocker tråd om annat projekt

Tyvärr nej. Felsökning är simpelt med ett så pass detaljerat felmeddelande(sätt en brytpunkt som @Xenofonus tipsar på rad 103 och skriv ut värdet i variabeln Selected före brytpunkten till debug fönstret så ser Du om felet är det jag tror att det är eller inte) .

Konstruktion är betydligt jobbigare.

Visa signatur

Grundregel för felsökning: Bryt och begränsa.