首页 > 解决方案 > 您好,请告诉我如何将 ArrayList 发送到另一个活动

问题描述

我尝试了我刚刚找到的所有可能的选项。我无法通过 Parcelable 接口将 ArrayList 发送到另一个活动。实现它发送的媒体播放器字符串格式信息。

我将不胜感激,也许还有其他选择。这是我第一次在这里提问

这是我用来发送的活动,代码仍然很原始

public class MainActivity extends AppCompatActivity {
    ScheduledExecutorService scheduledExecutorService;
    public MediaPlayer mediaPlayer;
    private SeekBar seekBar;

    private ImageView btn_Play;
    private ImageView btn_Next;
    private ImageView btn_Pre;
    private TextView setCurrentDuration, setTotalDuration;

    private ArrayList<SoundInfo> audioList = new ArrayList<>();
    SoundAdapter adapter = new SoundAdapter();

    public Handler handler = new Handler();
    AudioEffect audioEffect;

    private int currentPosition = 0;

    private SoundInfo soundInfo = new SoundInfo(this);
    SoundEffects soundEffects;
    boolean mediaPauseStat = false;
    Context context;
    PageFragmentOne pageFragmentOne;
    //public MainActivity(PageFragmentOne pageFragmentOne) {
    //    this.pageFragmentOne = pageFragmentOne;
    //}

    MediaManager mediaManager = new MediaManager(this, adapter, audioList);
    @Override
    protected void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        // Старт сервиса


        //Intent i = new Intent(this, MediaPlaybackService.class);
        //i.putExtra("play", "письмо от главного активити");
        //startService(i);

        //mediaManager.LoadSounds();
        /**
        SectionsPagerAdapter sectionsPagerAdapter = new SectionsPagerAdapter(this, getSupportFragmentManager());
        ViewPager viewPager = findViewById(R.id.view_pager);
        viewPager.setAdapter(sectionsPagerAdapter);
        TabLayout tabs = findViewById(R.id.tabs);
        tabs.setupWithViewPager(viewPager);
        FloatingActionButton fab = findViewById(R.id.fab);

        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });
**/

        ////////////////////////////////////////////////////////////////////////////////////////////




        setCurrentDuration = findViewById(R.id.current_Duration);
        setTotalDuration = findViewById(R.id.total_Duration);
        seekBar = findViewById(R.id.seekBar);


        RecyclerView list = findViewById(R.id.my_recycler_view);
        list.setAdapter(adapter);
        list.setLayoutManager(new LinearLayoutManager(this));


        // Оформление отображения адаптера
        DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(this, LinearLayout.VERTICAL);
        dividerItemDecoration.setDrawable(getResources().getDrawable(R.drawable.list_item_divider, null));
        list.addItemDecoration(dividerItemDecoration);

        ///////////////////////////////////////////////
        soundInfo.setMassive(audioList);



        adapter.setOnItemClickListener(new SoundAdapter.OnItemClickListener() {
            @Override
            public void onClick(View v, final SoundInfo obj, final int position, final ImageView onNext) {
                final SoundInfo path = audioList.get(position);
                String audioPath = obj.getData();
                prepareMedia(position);

                // Задаем текующию позицию трека
                currentPosition = position;

                mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                    @Override
                    public void onPrepared(MediaPlayer mediaPlayer) {
                        // TODO Auto-generated method stub
                        mediaPlayer.start();

                        // Всегда должен быть после старта плеера, что бы не вылазило 238
                        updateProgressBar();
                        //seekBar.setProgress(0);
                        seekBar.setMax(mediaPlayer.getDuration());
                        btn_Play.setImageResource(R.drawable.btn_pause);
                    }
                });

                // Перемотка аудио
                seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
                    @Override
                    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                        // Слишком часто обновляет
                    }

                    @Override
                    public void onStartTrackingTouch(final SeekBar seekBar) {
                        if (mediaPlayer != null) {
                            soundInfo.setMediaPauseStat(false);
                            soundInfo.setMediaRewind(false);
                            mediaPlayer.pause();

                            seekBar.setOnTouchListener(new View.OnTouchListener() {
                                @Override
                                public boolean onTouch(View v, MotionEvent event) {
                                    mediaPlayer.seekTo(seekBar.getProgress());
                                    return false;
                                }
                            });
                        }
                    }

                    @Override
                    public void onStopTrackingTouch(SeekBar seekBar) {
                        if (mediaPlayer != null) {
                            soundInfo.setMediaPauseStat(true);
                            //soundInfo.setMediaRewind(true);
                            mediaPlayer.start();
                        }
                    }
                });

                // Кнопка проигрывания и паузы
                btn_Play.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        if (!mediaPlayer.isPlaying()) {
                            onPlay();
                        } else {
                            onPaused();

                        }
                    }
                });

                // Следующий трек
                btn_Next.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        onNext();
                    }
                });

                // Предыдущий трек
                btn_Pre.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        onPre();
                    }
                });
            }
        });



        init();
    }



    private MyBroadcastReceiver myReceiver;

    @Override
    public void onResume() {
        super.onResume();
        myReceiver = new MyBroadcastReceiver();
        final IntentFilter intentFilter = new IntentFilter("YourAction");
        LocalBroadcastManager.getInstance(this).registerReceiver(myReceiver, intentFilter);
    }

    @Override
    public void onPause() {
        super.onPause();
        if (myReceiver != null)
            LocalBroadcastManager.getInstance(this).unregisterReceiver(myReceiver);
        myReceiver = null;
    }

    public class MyBroadcastReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {

           // String yourValue = b.getString("ser");

            Bundle bundle = intent.getExtras();


        }
    }


    public void onMainMediaPlayList(View view) {

        final Intent intent2 = new Intent(getApplicationContext(), MainMediaPlayList.class);

        Bundle bundle = new Bundle();
        bundle.putParcelableArrayList("MEDIA_MASSIVE", audioList);
        intent2.putExtras(bundle);


        startActivity(intent2);



        //Intent i = new Intent(MainActivity.this, MediaPlaybackService.class);
        //startService(i);


        ////////////////////////////////////////////////////////////////////////////////////////////


    }

    public void init() {

        if (ContextCompat.checkSelfPermission(this,
                Manifest.permission.READ_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED) {
            // Разрешение не предоставляется
            // Должны ли мы показать объяснение?
            if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                    Manifest.permission.READ_EXTERNAL_STORAGE)) {
                // Показать объяснение пользователю * асинхронно* -- не блокировать
                // этот поток ждет ответа пользователя! После пользователя
                // увидев объяснение, попробуйте еще раз запросить разрешение.
            } else {
                // Никаких объяснений не требуется; запросить разрешение
                ActivityCompat.requestPermissions(this,
                        new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,
                                Manifest.permission.READ_EXTERNAL_STORAGE,
                                Manifest.permission.MODIFY_AUDIO_SETTINGS,
                                Manifest.permission.RECORD_AUDIO},
                        101);

                // MY_PERMISSIONS_REQUEST_READ_CONTACTS является
                // app-определенная константа int. Метод обратного вызова получает
                // результат запроса.
            }
        } else {
            // Разрешение уже предоставлено
            //loadSounds();
            mediaManager.LoadSounds();
        }

        //bPlayPause = findViewById(R.id.bPlayPause);
        //lv = (ListView) findViewById(R.id.lvPlayList);
        btn_Play = findViewById(R.id.btn_Play);
        btn_Next = findViewById(R.id.btn_Next);
        btn_Pre = findViewById(R.id.btn_Pre);
    }

这是我的声音信息

public class SoundInfo implements Parcelable {
    private String data, artist, title;

    private Context context;
    private String pathData;

    public SoundInfo(MainActivity context) {
        this.context = context;
    }

    public SoundInfo() {
    }

    public SoundInfo(MainMediaPlayList context) {
        this.context = context;

    }

    public SoundInfo(MediaPlaybackService mediaPlaybackService, String star) {
        this.context = mediaPlaybackService;
        this.star = star;
    }


    protected SoundInfo(Parcel in) {
        data = in.readString();
        artist = in.readString();
        title = in.readString();
        pathData = in.readString();
        mediaPauseStat = in.readByte() != 0;
        ismediaRewind = in.readByte() != 0;
        audioList = in.createTypedArrayList(SoundInfo.CREATOR);
        star = in.readString();
    }

    public static final Creator<SoundInfo> CREATOR = new Creator<SoundInfo>() {
        @Override
        public SoundInfo createFromParcel(Parcel in) {
            return new SoundInfo(in);
        }

        @Override
        public SoundInfo[] newArray(int size) {
            return new SoundInfo[size];
        }
    };

    public void SoundInfo(String data, String artist, String title) {
        this.data = data;
        this.artist = artist;
        this.title = title;
    }
    public SoundInfo(String data, String artist, String title) {
        this.data = data;
        this.artist = artist;
        this.title = title;
    }


    public String getData() {
        return data;
    }

    public String getArtist() {
        return artist;
    }

    public String getTitle() {
        return title;
    }


    public void setData(String artist) {
        this.data = data;
    }

    public void setArtist(String artist) {
        this.artist = artist;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public void setpathData(String pathData) {
        this.pathData = pathData;
    }

    public String getpathData() {
        return pathData;
    }

    // Запись в память для отображения времени


    boolean mediaPauseStat = true;
    boolean ismediaRewind = true;

    public void setMediaPauseStat(boolean mediaPauseStat) {
        this.mediaPauseStat = mediaPauseStat;
    }

    public boolean getMediaPauseStat() {
        return mediaPauseStat;
    }


    public void setMediaRewind(boolean isMediaRewind) {
        this.ismediaRewind = ismediaRewind;
    }

    public boolean getMediaRewind() {
        return ismediaRewind;
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////
    // Массив
    private ArrayList<SoundInfo> audioList = new ArrayList<SoundInfo>();

    public ArrayList<SoundInfo> getMassive() {
        return audioList;
    }
    public void setMassive(ArrayList<SoundInfo> audioList) {
        this.audioList = audioList;
    }

    private String star;
    public String getStar() {
        return star;
    }
    public void setStar(String star) {
        this.star = star;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(data);
        dest.writeString(artist);
        dest.writeString(title);
        dest.writeString(pathData);
        dest.writeByte((byte) (mediaPauseStat ? 1 : 0));
        dest.writeByte((byte) (ismediaRewind ? 1 : 0));
        dest.writeTypedList(audioList);
        dest.writeString(star);
    }
}

这是我使用的适配器

public class SoundAdapter extends RecyclerView.Adapter<SoundAdapter.ViewHolder> {

    private ArrayList<SoundInfo> audioList = new ArrayList<SoundInfo>();
    Context context;

    //private String[] items;
    private OnItemClickListener onItemClickListener;

    public void setItems(Context context, ArrayList<SoundInfo> audioList) {
        this.context = context;
        this.audioList = audioList;
        //audioList.addAll(items);
    }

    public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
        this.onItemClickListener = onItemClickListener;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_audio, parent, false);

        return new ViewHolder(v);
    }

    @Override
    public void onBindViewHolder(@NonNull final ViewHolder holder, final int position) {
        holder.bind(audioList.get(position));

        holder.clickFile.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                final SoundInfo path = audioList.get(position);
                onItemClickListener.onClick(view, path, position, holder.onNext);
            }
        });
    }

    @Override
    public int getItemCount() {
        return audioList == null ? 0 : audioList.size();
    }

    static class ViewHolder extends RecyclerView.ViewHolder {
        private TextView data, title, artist;
        private ImageView onNext;
        private View clickFile;

        ViewHolder(View view) {
            super(view);
            title = view.findViewById(R.id.tvSoundTitle);
            artist = view.findViewById(R.id.tvSoundArtist);
            clickFile = view.findViewById(R.id.clickFile);
            //data = view.findViewById(R.id.item_title);
            //onNext = view.findViewById(R.id.imageNext);
        }
        public void bind(SoundInfo soundInfo) {
            title.setText(soundInfo.getTitle());
            artist.setText(soundInfo.getArtist());
            //clickFile.setText(soundInfo.getData());
        }
    }

    // Передача данных в основной активити
    public interface OnItemClickListener {
        void onClick(View view, SoundInfo obj, int position, ImageView onNext);
    }
}

这是 ArrayList 获得的第二个活动。

Bundle bundle = getIntent().getExtras();
        ArrayList<SoundInfo> audioList = bundle.getParcelableArrayList("MEDIA_MASSIVE");

        adapter.setItems(MainMediaPlayList.this, audioList);
        adapter.notifyDataSetChanged();



        // загрузка адаптера
        RecyclerView list = findViewById(R.id.my_recycler_view);
        list.setAdapter(adapter);
        list.setLayoutManager(new LinearLayoutManager(MainMediaPlayList.this));

当您打开一个新活动时,应用程序崩溃不会在日志中显示任何错误,问题是据我所知,在我看来,意图找不到 audioList 如果我删除了所有加载的方法

public void onMainMediaPlayList(View view) {

        final Intent intent2 = new Intent(getApplicationContext(), MainMediaPlayList.class);

        Bundle bundle = new Bundle();
        bundle.putParcelableArrayList("MEDIA_MASSIVE", audioList);
        intent2.putExtras(bundle);


        startActivity(intent2);

在这里,我删除了启动日志,它可能会有所帮助

2020-03-08 18:09:43.406 15730-15730/com.shimmer.myapplication W/r.myapplicatio: Accessing hidden method Landroid/view/View;->computeFitSystemWindows(Landroid/graphics/Rect;Landroid/graphics/Rect;)Z (greylist, reflection, allowed)
2020-03-08 18:09:43.406 15730-15730/com.shimmer.myapplication W/r.myapplicatio: Accessing hidden method Landroid/view/ViewGroup;->makeOptionalFitsSystemWindows()V (greylist, reflection, allowed)
2020-03-08 18:09:43.431 15730-15730/com.shimmer.myapplication I/OverScrollerOptimization: start init SmartSlideOverScroller and get the overscroller config
2020-03-08 18:09:43.431 15730-15730/com.shimmer.myapplication I/OverScrollerOptimization: get the overscroller config
2020-03-08 18:09:43.466 15730-15730/com.shimmer.myapplication D/HwFrameworkSecurityPartsFactory: HwFrameworkSecurityPartsFactory in.
2020-03-08 18:09:43.466 15730-15730/com.shimmer.myapplication I/HwFrameworkSecurityPartsFactory: add HwFrameworkSecurityPartsFactory to memory.
2020-03-08 18:09:43.506 15730-15730/com.shimmer.myapplication D/ActivityThread: add activity client record, r= ActivityRecord{e3185e4 token=android.os.BinderProxy@837d3d7 {com.shimmer.myapplication/com.shimmer.myapplication.MainActivity}} token= android.os.BinderProxy@837d3d7

标签: androidarraylist

解决方案


你有没有尝试过这样的arraylist,我认为可以,在 MainActivity.java

ArrayList<String> audioList= new ArrayList<>();
audioList.add("ChipThrills");
Intent i = new Intent(MainActivity.this, Secondactivity.class);
i.putExtra("Musickey", audioList);
startActivity(i);

在 SecondActivity.java 中

ArrayList<String> audioList = (ArrayList<String>) getIntent().getSerializableExtra("Musickey");

推荐阅读