۲ مهرداد معین پور
مشکل در پخش انیمیشن پخش موزیک
جامعه جاوا (اندروید) ایجاد شده در ۲۲ اردیبهشت ۱۳۹۹

سلام و روزتون بخیر ... دوستان من کد متد notifyMusicChange رو دقیقا مشابه کد استاد پیاده کردم :

public void notifyMusicChange(Music newMusic) {
    int index = musicList.indexOf(newMusic);
    if(index != -1){
        if(index != playingMusicPos){
            notifyItemChanged(playingMusicPos);
            playingMusicPos = index;
            notifyItemChanged(playingMusicPos);
        }
    }
}

و توی متد onBindMusic هم به صورت زیر :

if(getAdapterPosition() == playingMusicPos){
    music_effect.setVisibility(View.VISIBLE);
}else {
    music_effect.setVisibility(View.GONE);
}

مقدار اولیه playingMusicPos هم 1- هست . ولی مشکلی که هست ، برای آهنگ اول که اولین آهنگ لیست هست انیمیشن رو نمایش میده و آهنگ دوم هم نمایش میده ولی برای آهنگ سوم خیر نمایش نمیده و همچنین وقتی روی آهنگ اول بر میگردم باز انیمشین رو نمایش نمیده ولی روی آهنگ دوم بعضی مواقع نشون میده بعضی مواقع خیر ... دیباگ کردم کد رو ببینم مشکل از کجاست ، و فهمیدم مقادیر playingMusicPos و AdapterPosition به درستی مقدار دهی نمیشن . و حتی یه بار دیباگ کردم واسه اینکه از آهنگ دوم برم به آهنگ اول باید بعد از playingMusicPos = index مقدار playingMusicPos به 0 تغییر میکرد چون index صفر بود ولی تغییر نکرد و همون 1 موند!!!  کسی می‌دونه مشکل از کجاست؟

راستش من اساس کار notifyItemChange رو متوجه نمیشم ... اول فکر میکردم با هربار صدا زدن این تابع ، مقدار AdapterPosition آپدیت میشه به مقداری که به آرگومانش میدیم و اینکه هربار صدا زده میشه باید یه دور onBindViewHolder صدا زده بشه و در کل تغییرات آداپتر رو سرچ کنه و آپدیت کنه ... ینی انتظار داشتم چون اینجا دوبار صدا زده میشه این تابع ، دو بار هم دستورات زیر چک بشن ،

if(getAdapterPosition() == playingMusicPos){
    music_effect.setVisibility(View.VISIBLE);
}else {
    music_effect.setVisibility(View.GONE);
}

ولی اینطوری نبود و وقتی دیباگ کردم واسه موزیک اول یه بار چک شد واسه موزیک دوم و سوم و به بعد دوبار !!! ... جریان چیه کلا قاطی کردم کسی میتونه توضیح بده ممنون میشم؟

سلام مهرداد 

من الان روی پروژه حضور ذهن ندارم ولی اگر کل کدتون در MainActivity و Adapter رو اینجا کپی کنین تا اول ببینم مشکل از کجاست توضیح میدم واستون تا مشکلتون رفع شه

چرا که این چند خط کد مشکلی نداشتن .

راستی یه نکته بگم هنگام ارسال کد هاتون در اکادمی لطفا از زبان php  هنگام انتخاب format استفاده کنین که کد هاتونو بهم نریزه تا قابل خواندن باشه

 

پوریا شفیعی ۲۲ اردیبهشت ۱۳۹۹، ۰۶:۲۳

سلام پوریا جان صبحت بخیر ... ممنون بابت تذکر برای نحوه ی قرار دادن کد آخه من مستقیما از اندروید استودیو کد رو کپی پیست میکردم خخخخ

بفرما اینم کد mainActivity و Adapter ... البته یه سری تغییرات جزئی دادم .. مثلا بجا اینکه بعد از اجرا شرو کنه به خوندن با زدن play شروع کنه ... بفرما اینم کد :

MainActivity :

package com.android.musicplayer;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.View;
import com.android.musicplayer.databinding.ActivityMainBinding;
import com.facebook.drawee.backends.pipeline.Fresco;
import com.google.android.material.slider.Slider;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
public class MainActivity extends AppCompatActivity implements MusicAdapter.OnMusicClickListener {
    private MediaPlayer mediaPlayer;
    private ActivityMainBinding binding;
    private List<Music> musicList = Music.getList();
    private MusicState musicState = MusicState.STOPPED;
    private Timer timer;
    private boolean isDragging;
    private int cursor;
    private MusicAdapter musicAdapter;
    @Override
    public void onClick(Music music, int position) {
        timer.cancel();
        timer.purge();
        mediaPlayer.release();
        onMusicChange(musicList.get(position));
    }
    enum MusicState{
        PLAYING , PAUSED , STOPPED
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Fresco.initialize(getApplicationContext());
        binding = ActivityMainBinding.inflate(getLayoutInflater());
        setContentView(binding.getRoot());
        binding.rvMain.setLayoutManager(new LinearLayoutManager(this , RecyclerView.VERTICAL , false));
        musicAdapter = new MusicAdapter(musicList , this);
        binding.rvMain.setAdapter(musicAdapter);
        binding.playBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                switch (musicState){
                    case PAUSED:
                        mediaPlayer.start();
                        musicState = MusicState.PLAYING;
                        binding.playBtn.setImageResource(R.drawable.ic_play_circle_outline_75dp);
                        break;
                    case PLAYING:
                        mediaPlayer.pause();
                        musicState = MusicState.PAUSED;
                        binding.playBtn.setImageResource(R.drawable.ic_pause_circle_outline_75dp);
                        break;
                    case STOPPED:
                        onMusicChange(musicList.get(cursor));
                        musicState = MusicState.PLAYING;
                }
            }
        });
        binding.musicSlider.addOnChangeListener(new Slider.OnChangeListener() {
            @Override
            public void onValueChange(@NonNull Slider slider, float value, boolean fromUser) {
                binding.startMusicTv.setText(Music.ConvertMillisToString((long) value));
            }
        });
        binding.musicSlider.addOnSliderTouchListener(new Slider.OnSliderTouchListener() {
            @Override
            public void onStartTrackingTouch(@NonNull Slider slider) {
                isDragging = true;
            }
            @Override
            public void onStopTrackingTouch(@NonNull Slider slider) {
                isDragging = false;
                mediaPlayer.seekTo((int) slider.getValue());
            }
        });
    }
    private void onMusicChange(final Music music){
        musicAdapter.notifyMusicChange(music);
        binding.musicSlider.setValue(0);
        mediaPlayer = MediaPlayer.create(this , music.getMusicFileResId());
        mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                mediaPlayer.start();
                timer = new Timer();
                timer.schedule(new TimerTask() {
                    @Override
                    public void run() {
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                if (!isDragging) {
                                    //binding.startMusicTv.setText(Music.ConvertMillisToString(mediaPlayer.getCurrentPosition()));
                                    binding.musicSlider.setValue(mediaPlayer.getCurrentPosition());
                                }
                            }
                        });
                    }
                } , 1000 , 1000);
                binding.overMusicTv.setText(Music.ConvertMillisToString(mediaPlayer.getDuration()));
                binding.musicSlider.setValueTo(mediaPlayer.getDuration());
                musicState = MusicState.PLAYING;
                binding.playBtn.setImageResource(R.drawable.ic_play_circle_outline_75dp);
                mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                    @Override
                    public void onCompletion(MediaPlayer mp) {
                        goNext();
                    }
                });
            }
        });
        binding.coverIv.setActualImageResource(music.getCoverResId());
        binding.artistIv.setActualImageResource(music.getArtistResId());
        binding.artistNameTv.setText(music.getArtist());
        binding.musicNameTv.setText(music.getName());
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        timer.cancel();
        mediaPlayer.release();
        mediaPlayer = null;
    }
    private void goNext(){
        timer.cancel();
        timer.purge();
        mediaPlayer.release();
        if(cursor < musicList.size()-1)
            cursor +=1;
        else
            cursor = 0;
        onMusicChange(musicList.get(cursor));
    }
}

 MusicAdapter :

package com.android.musicplayer;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.airbnb.lottie.LottieAnimationView;
import com.facebook.drawee.view.SimpleDraweeView;
import java.util.List;
public class MusicAdapter extends RecyclerView.Adapter<MusicAdapter.musicViewHolder> {
    private List<Music> musicList;
    private int playingMusicPos = -1;
    private LottieAnimationView music_effect;
    private OnMusicClickListener onMusicClickListener;
    public MusicAdapter(List<Music> musicList , OnMusicClickListener onMusicClickListener) {
        this.onMusicClickListener = onMusicClickListener;
        this.musicList = musicList;
    }
    @NonNull
    @Override
    public musicViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        return new musicViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.iterm_music , parent , false));
    }
    @Override
    public void onBindViewHolder(@NonNull musicViewHolder holder, int position) {
        holder.bindMusic(musicList.get(position));
    }
    @Override
    public int getItemCount() {
        return musicList.size();
    }
    public class musicViewHolder extends RecyclerView.ViewHolder{
        private SimpleDraweeView simpleDraweeView;
        private TextView artistName;
        private TextView musicName;
        public musicViewHolder(@NonNull View itemView) {
            super(itemView);
            simpleDraweeView = itemView.findViewById(R.id.iv_music_cover);
            artistName = itemView.findViewById(R.id.tv_music_artist);
            musicName = itemView.findViewById(R.id.tv_music_name);
            music_effect = itemView.findViewById(R.id.music_effect);
        }
        public void bindMusic(final Music music){
            simpleDraweeView.setActualImageResource(music.getCoverResId());
            artistName.setText(music.getArtist());
            musicName.setText(music.getName());
            if(getAdapterPosition() == playingMusicPos){
                music_effect.setVisibility(View.VISIBLE);
            }else {
                music_effect.setVisibility(View.GONE);
            }
            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    onMusicClickListener.onClick(music , getAdapterPosition());
                }
            });
        }
    }
    public void notifyMusicChange(Music newMusic) {
        int index = musicList.indexOf(newMusic);
        if(index != -1){
            if(index != playingMusicPos){
                notifyItemChanged(playingMusicPos);
                playingMusicPos = index;
                notifyItemChanged(playingMusicPos);
            }
        }
    }
    public  interface OnMusicClickListener{
        void onClick(Music music , int position);
    }
}

 

مهرداد معین پور ۲۲ اردیبهشت ۱۳۹۹، ۰۷:۱۷