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){}
}
Så jag kommer ihåg. [code][/code]