2016-10-31 63 views
0

我真的被困在這裏,我是編程新手。 我在我的音樂應用程序中取得了很多成績,但是現在我使用OnClickListener在listViewAdapter中創建了一個按鈕,並且想要在MainActivity中將歌曲添加到favList ArrayList。通過這段代碼,我可以得到我想要的歌曲,但是我怎樣才能將它放入列表中?Android:如何將數據從適配器傳遞到OnClickListener的主要活動

這裏是我此代碼:

class SongAdapter extends ArrayAdapter<Song> { 

    SongAdapter(Context context, ArrayList<Song> songs) { 
     super(context, 0, songs); 
    } 

    @NonNull 
    @Override 
    public View getView(final int position, View convertView, @NonNull ViewGroup parent) { 
     // Check if the existing view is being reused, otherwise inflate the view 
     View listItemView = convertView; 
     if (listItemView == null) { 
      listItemView = LayoutInflater.from(getContext()).inflate(R.layout.list_item, parent, false); 
     } 
     Song currentSong = getItem(position); 

     TextView songNameTextView = (TextView) listItemView.findViewById(R.id.song_name); 
     assert currentSong != null; 
     songNameTextView.setText(currentSong.getSongName()); 
     TextView songArtistTextView = (TextView) listItemView.findViewById(R.id.song_artist); 
     songArtistTextView.setText(currentSong.getArtist()); 

     ImageButton addToPlaylistButton = (ImageButton) listItemView.findViewById(R.id.addToPlaylist); 
     addToPlaylistButton.setTag(position); 
     addToPlaylistButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       int position = (Integer) view.getTag(); 
       Song song = getItem(position); 
       Toast.makeText(view.getContext(), song.getAlbum().toString(), Toast.LENGTH_LONG).show(); 
      } 
     }); 

     return listItemView; 
    } } 

這裏是從我的MainActivity的部分:

final ArrayList<Song> songs = new ArrayList<>(); final ArrayList<Song> favSongs = new ArrayList<>(); 

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.song_list); 
     //Setup the Listview for the Songs 
      SongAdapter adapter = new SongAdapter(this, songs); 
      ListView listView = (ListView) findViewById(R.id.list); 
      listView.setItemsCanFocus(true); 
      listView.setAdapter(adapter); 
      } 

回答

0

您應該在活動創建自己的OnItemClickListener設置它適配器,然後派遣的onClick定位到該自定義偵聽器的事件。

interface OnItemClickListener { 
    void onItemClicked(int position); 
} 
在活動

private OnItemClickListener listener = new OnItemClickListener() { 
    public void onItemClicked(int position) { 
     Song song = adapter.get(position); 
     //do whatever you want with song 
    } 
} 

//creation of adapter 
SongAdapter adapter = new SongAdapter(this, songs, listener); 

適配器:

private OnItemClickListener onClickListener; 

SongAdapter(Context context, ArrayList<Song> songs, OnItemClickListener onClickListener) { 
    super(context, 0, songs); 
    this.onClickListener = onClickListener; 
} 

//in getView 
addToPlaylistButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      if (onClickListener != null) { 
       onClickListener.onItemClicked(position); 
      } 
     } 
    }); 
+0

非常感謝你,我實現了你的代碼,並處理了所有我得到的錯誤,現在它真的起作用了。我仍然有一個問題,我從來沒有在界面上使用過你的第一塊代碼,那會怎麼做? 我應該也發佈我的完整解決方案代碼在這裏爲其他人嗎?這是我的第一個問題。 – Tyrone3

+0

@ Tyrone3閱讀這裏:[什麼是接口](https://docs.oracle.com/javase/tutorial/java/concepts/interface.html)。不久它就是一個合同,該類應該實施。類可以實現許多合約。在活動中,我創建了該接口的匿名實例。如果我的答案符合您的所有需求,則不應發佈完整的解決方案。儘量讓你的問題/答案不那麼具體,適用於廣泛的讀者。 – Beloo

0

您可以只使用引用當你創建你傳遞給適配器的songs。類似這樣的:

class SongAdapter extends ArrayAdapter<Song> { 

    private ArrayList<song> songs; 

    SongAdapter(Context context, ArrayList<Song> songs) { 
     this.songs = songs 
     super(context, 0, songs); 
    } 

    (snip...) 

     @Override 
     public void onClick(View view) { 
      int position = (Integer) view.getTag(); 
      Song song = getItem(position); 

      songs.add(song); 
      (...) 
     } 
    }); // end of listener 

} 
} 

而你的ArrayList現在將包含你的Song

另一個更簡單的方法是在主活動static中創建ArrayList,以便您可以從任何地方引用它,但是,在Android上不推薦這樣做。

+0

感謝您的代碼,我從來沒有試過你的代碼,因爲我得到了上面的代碼工作。你也錯過了這個事實,我想從Song ArrayList中取出一首歌,但是我想將它放入MainActivity的favList中。 – Tyrone3

相關問題