آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

تغییر آیتم های RecyclerView کلیک نشده بعد از اسکرول(کارم لنگ اینه) ...

Shadow  9 سال پیش  9 سال پیش
+1 0

من توی ریسایکلر ویو یه عکس گذاشتم که بعد از کلیک کردن اهنگ رو پخش می کنه و عکس عوض میشه و وقتی اسکرول می کنم یه آیتم دیگه هم در پایین عوض می شه که روش کلیک نکردم ؟ لطفا کمک کنید خیلی گشتم ولی نتونستم جوابی پیدا کنم ؟! این کد آداپتر :

 
public class RingtoneAdapter extends RecyclerView.Adapter<RingtoneAdapter.RingtoneViewHolder> {
MediaPlayer mediaPlayer;
ObjectAnimator animation;
private Context context;
private List<RingtoneItem> ringtoneItems;

public RingtoneAdapter(Context context, List<RingtoneItem> ringtoneItems) {

this.context = context;
this.ringtoneItems = ringtoneItems;
}

@Override
public RingtoneViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.ringtone_item, parent, false);

return new RingtoneViewHolder(view);
}

@Override
public void onBindViewHolder(final RingtoneViewHolder holder, int position) {
final RingtoneItem ringtoneItem = ringtoneItems.get(position);
holder.downloadCount.setText(String.valueOf(ringtoneItem.getDownload()));
mediaPlayer = new MediaPlayer();
try {
mediaPlayer.setDataSource(context, Uri.parse(ringtoneItem.getUrl()));
mediaPlayer.prepareAsync();

mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(final MediaPlayer mediaPlayer) {

holder.play.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {

if (mediaPlayer.isPlaying()) {
mediaPlayer.stop();
mediaPlayer.prepareAsync();

holder.play.setImageResource(R.mipmap.ic_play_circle_filled_black_24dp);
animation.cancel();
holder.progressBar.setVisibility(View.INVISIBLE);
} else {
mediaPlayer.start();
animation = ObjectAnimator.ofInt(holder.progressBar, "progress", 0, 500);
holder.play.setImageResource(R.mipmap.ic_pause_circle_filled_black_24dp);
animation.setDuration(mediaPlayer.getDuration());
animation.setInterpolator(new DecelerateInterpolator());
animation.start();
holder.progressBar.setVisibility(View.VISIBLE);
if (formatDuration(mediaPlayer.getCurrentPosition()) == formatDuration(mediaPlayer.getDuration())){
holder.progressBar.setVisibility(View.INVISIBLE);
}


}
}
});

}
});
} catch (IOException e) {
e.printStackTrace();
}


}

@Override
public int getItemCount() {
return ringtoneItems.size();
}

private void mediaPlayerFromUri(String uri) {
mediaPlayer = new MediaPlayer();
try {
mediaPlayer.setDataSource(context, Uri.parse(uri));
mediaPlayer.prepareAsync();
mediaPlayer.start();

} catch (IOException e) {
e.printStackTrace();
}
}

public class RingtoneViewHolder extends RecyclerView.ViewHolder {
TextView downloadCount, name;
ImageView play;
RelativeLayout layout;
ProgressBar progressBar;

public RingtoneViewHolder(View itemView) {
super(itemView);
progressBar = (ProgressBar) itemView.findViewById(R.id.progressBar);
downloadCount = (TextView) itemView.findViewById(R.id.downloadRing);
play = (ImageView) itemView.findViewById(R.id.play);
layout = (RelativeLayout) itemView.findViewById(R.id.layout);

}
}
private String formatDuration(long duration) {
int seconds = (int) (duration / 1000);
int minutes = seconds / 60;
seconds %= 60;
return String.format(Locale.ENGLISH, "%02d", minutes) + ":" + String.format(Locale.ENGLISH, "%02d", seconds);
}
}
0 0
هر آیتی که جدید وارد لیست میشه ، اگر در متد مربوطه بهش مقدار ست بشه با مقدار جدید وارد میشه ، ولی اگر مقداری ست نشه ، آخرین مقداری که قبلا روی اون آیتم بوده رو نمایش میده ، پس شما اگر قراره مقدار آیتمی رو تغییر بدید نباید مستقیما روی View تاثیر بدید ، باید اون View مقدارش رو از متد دریافت کنه و شما اگر میخواید تغییری انجام بدید باید متغیر موجود در آداپتر رو تغییر بدید که متناظر با position تغییرات روی View مورد نظر شما انجام بشه (9 سال پیش)
0 0
خوب کار از توضیح دادن گذشته من کمک عملی می خوام من دقیقا می دونم چجوری باید حلش کنم ولی توی کد نوشتنش مشکل دارم . لطفا راهنمایی بیشتری بدید از نوع CODE (9 سال پیش)
 برای این سوال 2 پاسخ وجود دارد. مشاهده پاسخ صحیح
پاسخ به سوال 
Shadow  9 سال پیش
0 0

چرا کسی جواب سوال منو نمیده یعنی کسی توی این انجمن بلد نیست خودم یه کارایی کردم اینکه وقتی روی ایتم کلیک می کنم فقط اون ایتم تغییر کنه ولی بازم وقتی اسکرول می کنم و برمیگرم سر جای اول اون آیتمی رو که کلیک کرده بودم به حالت اولیه برمیگرده؟

 
public void onBindViewHolder(final RingtoneViewHolder holder, final int position) {
final RingtoneItem ringtoneItem = ringtoneItems.get(position);
holder.downloadCount.setText(String.valueOf(position + 1) + "+ " + ringtoneItem.getId());
if (position + 1 == ringtoneItem.getId()) {
holder.play.setImageResource(R.mipmap.ic_play_circle_filled_black_24dp);
holder.progressBar.setVisibility(View.INVISIBLE);
}else {
holder.play.setImageResource(R.mipmap.ic_pause_circle_filled_black_24dp);
}

mediaPlayer = new MediaPlayer();
try {
mediaPlayer.setDataSource(context, Uri.parse(ringtoneItem.getUrl()));
mediaPlayer.prepareAsync();

mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(final MediaPlayer mediaPlayer) {

holder.play.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {

if (mediaPlayer.isPlaying()) {
mediaPlayer.stop();
mediaPlayer.prepareAsync();
animation.cancel();
holder.play.setImageResource(R.mipmap.ic_play_circle_filled_black_24dp);
holder.progressBar.setVisibility(View.INVISIBLE);
} else {
mediaPlayer.start();
animation = ObjectAnimator.ofInt(holder.progressBar, "progress", 0, 500);
selected_item = 1;
animation.setDuration(mediaPlayer.getDuration());
animation.setInterpolator(new DecelerateInterpolator());
animation.start();
holder.play.setImageResource(R.mipmap.ic_pause_circle_filled_black_24dp);

holder.progressBar.setVisibility(View.VISIBLE);
if (formatDuration(mediaPlayer.getCurrentPosition()) == formatDuration(mediaPlayer.getDuration())) {
holder.progressBar.setVisibility(View.INVISIBLE);
}

}

}
});
}
});
پاسخ به سوال 
Shadow  9 سال پیش
0 0

 پاسخ صحیح

خوب این مشکل رو حل کردم با کمک خودم دوستان خیلی کم لطفی می کنن و جواب سوال ها رو نمیدن به این شکل :

ولی الان به مشکلی دارم اینه که نمی دونم اینجوری چطور اهنگ ها رو پخش کنم چون امتحان کردم پخش می شه ولی با دوبار کلیک کردن برنامه فورس کلوز میشه خلاصه اینبار گیر این افتادیم لطفا راهنمایی کنید که چجوری آهنگ مربوط به هر آیتم از لیستم رو پخش کنم ؟

 public void onBindViewHolder(final RingtoneViewHolder holder, final int position) {
    final RingtoneItem ringtoneItem = ringtoneItems.get(position);
    holder.downloadCount.setText(String.valueOf(position + 1) + "+ " + ringtoneItem.getId());
    if (ringtoneItems.get(position).isFav()) {
      holder.play.setImageResource(R.mipmap.ic_pause_circle_filled_black_24dp);
    } else {
      holder.play.setImageResource(R.mipmap.ic_play_circle_filled_black_24dp);
    }
    mediaPlayer = new MediaPlayer();
    holder.play.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View view) {
        if (!ringtoneItems.get(position).isFav()) {
          holder.play.setImageResource(R.mipmap.ic_pause_circle_filled_black_24dp);
          ringtoneItems.get(position).setFav(true);


        } else {
          holder.play.setImageResource(R.mipmap.ic_play_circle_filled_black_24dp);
          ringtoneItems.get(position).setFav(false);


        }
      }
    });
+2 0
به نظر من بهتره تمام فرایند مدیریت و پخش موزیک رو توی یک کلاس دیگه بنویسید. مثلا یک کلاس به نام MusicHandler درست کنید. ترجیحا استاتیک باشه. توی اکتیویتی یک اینستنس ازش بسازید. زمانی که اداپتر رو میسازید یک لیستنر بهش پاس بدید، وقتی قرار بود اهنگی پخش بشه اون لیستنر توی اکتیویتی کال بشه. اکتیویتی اون کلاس musicHandler رو کال کنه و آهنگ پخش بشه. با اینکار میتونید آهنگ رو توی تمام برنامه داشته باشید، میتونید به راحتی موزیک پلیرتون رو کاستوم کنید، میتونید از کرش ها و پخش چند موزیک با هم جلوگیری کنید و سورس کدتون تمیز میشه. در حال حاضر شما توی اداپتر داریم هربار مدیاپلیر میسازید، اینکار صحیح نیست و بجاش باید با ادرس جدید مدیاپلیر رو اپدیت کنید. (9 سال پیش)

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .