Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/211.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android应用程序-Java:添加到arrayList,然后更新ListView_Java_Android - Fatal编程技术网

Android应用程序-Java:添加到arrayList,然后更新ListView

Android应用程序-Java:添加到arrayList,然后更新ListView,java,android,Java,Android,我编写了这个android应用程序,它生成一个列表视图,其中包含来自互联网的歌曲,用户可以使用mediaPlayer单击播放 我遇到的问题是允许用户向填充ListView的arrayList添加歌曲。我使用设置页面添加文本框,用户可以通过输入歌曲名称、歌手和歌曲的直接链接来添加歌曲。虽然我用于此的代码不起作用,但它应该将歌曲名称、艺术家和直接链接添加到array_list_music ArrayList中,然后更新ListView,或者至少我认为应该这样做 我在下面展示了我的代码 所以,如果有人

我编写了这个android应用程序,它生成一个列表视图,其中包含来自互联网的歌曲,用户可以使用mediaPlayer单击播放

我遇到的问题是允许用户向填充ListView的arrayList添加歌曲。我使用设置页面添加文本框,用户可以通过输入歌曲名称、歌手和歌曲的直接链接来添加歌曲。虽然我用于此的代码不起作用,但它应该将歌曲名称、艺术家和直接链接添加到array_list_music ArrayList中,然后更新ListView,或者至少我认为应该这样做

我在下面展示了我的代码

所以,如果有人能帮助解决这个问题,那就太好了,谢谢

MainActivity.java

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
    的新实例;每次都会有一个新的列表。制作
    array\u list\u music
    static将确保您不必这样做
  • 直接访问
    array\u list\u music
    将迫使您反复执行相同的代码。
    MainActivity#addSong
    方法封装了此行为,由于它是静态的,因此不依赖于
    MainActivity
    的实例
  • addSong
    中,我们使用在
    MainArrayAdapter
    中实现的方法,该方法将通知所有侦听器更新;这样,列表将被重新绘制

你说的“不起作用”是什么意思?你到底想看什么以及发生了什么?你有可以与我们共享的错误日志吗?我的意思是,当我在应用程序中打开设置页面,输入歌曲名称、艺术家和直接链接(url)并单击“添加歌曲”按钮时,歌曲不会添加到主页的列表视图中,这就是我在工作中遇到的问题。至于错误日志,没有错误,只是新的详细信息没有添加到ListView。您好,谢谢回复,所以我输入了您提供的代码,但我不太理解,您能解释一下吗?这个数据数组是否替换了数组列表音乐?这是适配器,因此它负责告诉列表它应该显示什么。每次要更改列表中的数据时,请使用
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);
    }
}