Android应用程序-Java:添加到arrayList,然后更新ListView
我编写了这个android应用程序,它生成一个列表视图,其中包含来自互联网的歌曲,用户可以使用mediaPlayer单击播放 我遇到的问题是允许用户向填充ListView的arrayList添加歌曲。我使用设置页面添加文本框,用户可以通过输入歌曲名称、歌手和歌曲的直接链接来添加歌曲。虽然我用于此的代码不起作用,但它应该将歌曲名称、艺术家和直接链接添加到array_list_music ArrayList中,然后更新ListView,或者至少我认为应该这样做 我在下面展示了我的代码 所以,如果有人能帮助解决这个问题,那就太好了,谢谢 MainActivity.javaAndroid应用程序-Java:添加到arrayList,然后更新ListView,java,android,Java,Android,我编写了这个android应用程序,它生成一个列表视图,其中包含来自互联网的歌曲,用户可以使用mediaPlayer单击播放 我遇到的问题是允许用户向填充ListView的arrayList添加歌曲。我使用设置页面添加文本框,用户可以通过输入歌曲名称、歌手和歌曲的直接链接来添加歌曲。虽然我用于此的代码不起作用,但它应该将歌曲名称、艺术家和直接链接添加到array_list_music ArrayList中,然后更新ListView,或者至少我认为应该这样做 我在下面展示了我的代码 所以,如果有人
package com.superandroidtutorials.supermusic;
import java.util.ArrayList;
import android.app.ListActivity;
import android.content.Intent;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnPreparedListener;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.MediaController;
import android.widget.Toast;
public class MainActivity extends ListActivity implements OnPreparedListener, MediaController.MediaPlayerControl {
private static final String TAG = "AudioPlayer";
private ListView list;
public MainArrayAdapter adapter;
private MediaPlayer mediaPlayer;
private MediaController mediaController;
private String audioFile;
private Handler handler = new Handler();
ArrayList<String> array_list_music = new ArrayList<String>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
list = getListView();
mediaPlayer = new MediaPlayer();
mediaPlayer.setOnPreparedListener(this);
mediaController = new MediaController(this);
//ArrayList<String> array_list_music = new ArrayList<String>();
//Used to add a song to the array list
array_list_music
.add("Song Name"
+ " ### "
+ "Artist"
+ " ### "
+ "http://incoming.jazz-on-line.com/a/mp3w/1941_149.mp3");
array_list_music
.add("Song Name"
+ " ### "
+ "Artist"
+ " ### "
+ "http://tindeck.com/download/2dc7b728b491c2211bbe68f10785e59c/xvla/%5Btindeck.com%5D%20-%20Bob%20Acri%20-%20Sleep%20Away.mp3");
array_list_music
.add("Song Name"
+ " ### "
+ "Artist"
+ " ### "
+ "http://tinyurl.com/lo4j7rm");
adapter = new MainArrayAdapter(MainActivity.this, array_list_music);
setListAdapter(adapter);
//used to display toast and to play song using the URL, when clicking on a song
list.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
Object item = getListView().getItemAtPosition(arg2);
String the_list_item = item.toString();
Toast.makeText(MainActivity.this, "You are now listening to: " + the_list_item, Toast.LENGTH_LONG).show();
String[] aux = the_list_item.split(" ### ");
String url_to_play = aux[2];
playAudio(url_to_play);//sends url from arraylist item to the playAudio method
}
});
}
//used to play audio using the android mediaPlayer
private void playAudio(String url_to_play) {
//stop & reset player
try {
mediaPlayer.stop();
mediaPlayer.reset();
} catch (Exception e) {
}
//set the url, prepare it, and then play it
try {
mediaPlayer.setDataSource(url_to_play);
mediaPlayer.prepare();
mediaPlayer.start();
} catch (Exception e) {
Log.e(TAG, "Could not open file " + url_to_play + ".", e);
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_settings:
Intent i_settings = new Intent(MainActivity.this, SettingsActivity.class);
startActivity(i_settings);
break;
}
return true;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
mediaController.show();
return false;
}
//used to hide media controller, stop the media player and to release the url.
@Override
protected void onStop() {
super.onStop();
mediaController.hide();
mediaPlayer.stop();
mediaPlayer.release();
}
@Override
public boolean canPause() {
return true;
}
@Override
public boolean canSeekBackward() {
return true;
}
@Override
public boolean canSeekForward() {
return true;
}
@Override
public int getBufferPercentage() {
return 0;
}
@Override
public int getCurrentPosition() {
return mediaPlayer.getCurrentPosition();
}
@Override
public int getDuration() {
return mediaPlayer.getDuration();
}
@Override
public boolean isPlaying() {
return mediaPlayer.isPlaying();
}
@Override
public void pause() {
mediaPlayer.pause();
}
@Override
public void seekTo(int arg0) {
mediaPlayer.seekTo(arg0);
}
@Override
public void start() {
mediaPlayer.start();
}
public void onPrepared(MediaPlayer mediaPlayer) {
Log.d(TAG, "onPrepared");
mediaController.setMediaPlayer(this);
mediaController.setAnchorView(list);
handler.post(new Runnable() {
public void run() {
mediaController.setEnabled(true);
mediaController.show();
}
});
}
//------- what can you do from here -------
// implement your own media player with buttons since this one is not behaving "smart"..
// make next,previous buttons
// highlight the list item on click
// add your own server for playing music
// anything you want :)
}
package com.superandroidtutorials.supermusic;
import android.app.Activity;
import android.view.View;
import android.widget.EditText;
import com.superandroidtutorials.supermusic.R;
public class SettingsActivity extends Activity {
public String str ="";
String songName;
String artist;
String directLink;
protected void onCreate(android.os.Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_settings);
songName = ((EditText)findViewById(R.id.editTextSongName)).toString();
artist = ((EditText)findViewById(R.id.editTextArtist)).toString();
directLink = ((EditText)findViewById(R.id.editTextDirectLink)).toString();
};
public void buttonAddSongClicked(View v)
{
addSong(songName, artist, directLink);
}
private void addSong(String artist, String songName, String directLink)
{
MainActivity main = new MainActivity();
main.array_list_music
.add( songName
+ " ### "
+ artist
+ " ### "
+ directLink);
main.adapter.notifyDataSetChanged();
main.adapter = new MainArrayAdapter(main, main.array_list_music);
}
}
您的适配器应该实现使用观察者模式的。然后创建一个s列表并使用该列表,例如:
public class MainArrayAdapter extends ArrayAdapter<String> implements ListAdapter {
private List<DataSetObserver> observers = new LinkedList<DataSetObserver>();
//...
public void setArray(ArrayList<String> data_array) {
this.data_array = data_array;
for (DataSetObserver observer : observers) {
observer.onChanged();
}
}
@Override
public void registerDataSetObserver(DataSetObserver dataSetObserver) {
((LinkedList) observers).addFirst(dataSetObserver);
}
@Override
public void unregisterDataSetObserver(DataSetObserver dataSetObserver) {
observers.remove(dataSetObserver);
}
}
及
解释:
- 不能每次更新列表时都创建
的新实例;每次都会有一个新的列表。制作MainActivity
static将确保您不必这样做array\u list\u music
- 直接访问
将迫使您反复执行相同的代码。array\u list\u music
方法封装了此行为,由于它是静态的,因此不依赖于MainActivity#addSong
的实例MainActivity
- 在
中,我们使用在addSong
中实现的方法,该方法将通知所有侦听器更新;这样,列表将被重新绘制MainArrayAdapter
array\u list\u music
调用setArray(ArrayList)
函数(该函数位于MainActivity
中,而不是MainArrayAdapter
)。然后它会自动用新数据重新加载列表。好的,你能告诉我在设置活动中需要使用的代码吗?对于addSong和ButtonAndSongClicked方法?这样,在EditText中输入的详细信息将添加到数组和listView中?我已编辑了我的答案,以反映您对addSong
方法所需的更改。请确保您理解,为什么我要更改我更改的内容,它们是非常基本的问题,如果您不这样做,将在您开发的许多应用程序中导致问题。另外,如果你不需要的话,永远不要让一个领域成为非私人领域。非常感谢!android编程新手,但我现在明白了,为什么要更改/添加这些代码。再次感谢。杰森。
public class MainArrayAdapter extends ArrayAdapter<String> implements ListAdapter {
private List<DataSetObserver> observers = new LinkedList<DataSetObserver>();
//...
public void setArray(ArrayList<String> data_array) {
this.data_array = data_array;
for (DataSetObserver observer : observers) {
observer.onChanged();
}
}
@Override
public void registerDataSetObserver(DataSetObserver dataSetObserver) {
((LinkedList) observers).addFirst(dataSetObserver);
}
@Override
public void unregisterDataSetObserver(DataSetObserver dataSetObserver) {
observers.remove(dataSetObserver);
}
}
public class MainActivity extends ListActivity implements OnPreparedListener, MediaController.MediaPlayerControl {
// ...
private static MainArrayAdapter adapter;
private static ArrayList<String> array_list_music = new ArrayList<String>();
// ...
static void addSong(String song)
{
MainActivity.array_list_music.add(song);
adapter.setArray(array_list_music);
}
}
public class SettingsActivity extends Activity {
// ...
private void addSong(String artist, String songName, String directLink)
{
MainActivity.addSong(songName
+ " ### "
+ artist
+ " ### "
+ directLink);
}
}