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

تغییر بکگراند قبلی بعد از انتخاب یک آیتم دیگر از لیست 

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

خوب توی این لینک من یه gif گذاشتم که قشنگ معلومه مشکل من چیه :

وقتی روی دومین انتخابم کلیک می کنم انتخاب قبلیم ایکنش عوض نمیشه نمیدونم باید چکار کنم ؟!

گیف نمایش مشکل

اینم از کد آداپتر من

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

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, final int position) {
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);
holder.progressBar.setVisibility(View.VISIBLE);
} else {
holder.play.setImageResource(R.mipmap.ic_play_circle_filled_black_24dp);
holder.progressBar.setVisibility(View.INVISIBLE);

}
mediaPlayer = new MediaPlayer();
holder.play.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (mediaPlayer.isPlaying() ) {

if (positionRing == position) {
holder.progressBar.setVisibility(View.INVISIBLE);
holder.play.setImageResource(R.mipmap.ic_play_circle_filled_black_24dp);
ringtoneItems.get(position).setFav(false);
mediaPlayer.stop();
mediaPlayer.reset();

}else {
getRingtoneFromUrl(ringtoneItems.get(position).getUrl(), holder, position);

}


} else {
getRingtoneFromUrl(ringtoneItems.get(position).getUrl(), holder, position);

}


}
});


}

private void getRingtoneFromUrl(String url, final RingtoneViewHolder holder, final int position) {
try {
mediaPlayer.reset();
mediaPlayer.setDataSource(context, Uri.parse(url));
mediaPlayer.prepare();
} catch (IOException e) {
e.fillInStackTrace();
}
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(final MediaPlayer mediaPlayer) {
if (mediaPlayer.isPlaying()) {
mediaPlayer.stop();
mediaPlayer.release();

animation.cancel();
holder.progressBar.setVisibility(View.INVISIBLE);
holder.play.setImageResource(R.mipmap.ic_play_circle_filled_black_24dp);
ringtoneItems.get(position).setFav(false);


} else {
mediaPlayer.start();
positionRing = position;
animation = ObjectAnimator.ofInt(holder.progressBar, "progress", 0, 500);
animation.setDuration(mediaPlayer.getDuration());
animation.setInterpolator(new DecelerateInterpolator());
animation.start();
holder.progressBar.setVisibility(View.VISIBLE);
holder.play.setImageResource(R.mipmap.ic_pause_circle_filled_black_24dp);
ringtoneItems.get(position).setFav(true);
animation.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animator) {

}

@Override
public void onAnimationEnd(Animator animator) {
holder.progressBar.setVisibility(View.INVISIBLE);
holder.play.setImageResource(R.mipmap.ic_play_circle_filled_black_24dp);
ringtoneItems.get(position).setFav(false);
}

@Override
public void onAnimationCancel(Animator animator) {

}

@Override
public void onAnimationRepeat(Animator animator) {

}
});

}
}
});
}

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

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);
}

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

public RingtoneViewHolder(final 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);


}
}
}
+1 0
باید مدیاپلیر و ویوهای قبلی رو یک جا نگه دارید، وقتی آهنگ جدید خواست پلی بشه اول قبلی رو به حالت عادی برگردونید و بعد آهنگ جدید رو پخش کنید. (9 سال پیش)
0 0
منظورتون از اینکه یه جا نگه دارین چیه آیا منظورتون همون کاریه که من کردم و position آیتم قبلی رو داخل positionRing ذخیره کردم (9 سال پیش)
0 0
بله به همین صورت که position رو ذخیره میکنید. ویوها رو هم ذخیره کنید. توی اونیکی پستتون گفتم یک کلاس استاتیک بسازید. میتونید همونجا ویوها رو هم بگیرید و وقتی آهنگ جدید پلی شد قبلی ها که موجوده رو به حالت اول برگردونید و بعد جدیدارو ست کنید. (9 سال پیش)
0 0
اقای حاج حسینی کد ویرایش شده رو توی پایین نوشتم ولی باز من توی ذخیره کردن این ویوها مشکل دارم یعنی نمی تونم درکش کنم لطفا با کد راهنمایی کنید واقعا چند روزه من درگیر این موضوعم . (9 سال پیش)
 برای این سوال 3 پاسخ وجود دارد. مشاهده پاسخ صحیح
پاسخ به سوال 
FSR  9 سال پیش
0 -1

شما باید ادپتر رو notifyDataSetChanged و برای اینکه مشکلی پیش نیاد باید شما ادپتر رو تویه کلاس G تعریف کنید.

این رو امتحان کنید ببیند درست میشه یا نه.

0 0
نه این رو امتحان کردم درست نمیشه (9 سال پیش)
0 0
فقط تویه کلاس G درست کار میکنه یا ! شما بعد کلیک شدن رویه هر دکمه notifyDataSetChanged رو انجام بدید (9 سال پیش)
0 0
می دونم با این دوnotifyDataSetChanged و notifyItemChangedدرست میشه ولی نمی دون کجا صداشون بزنم؟! (9 سال پیش)
0 0
بعد از هر بار کلیک این رو صدا کن (9 سال پیش)
0 0
دوست عزیز هیچ وقت آداپتر رو استاتیک تعریف نکنید (در کلاس G) چون مشکلات زیادی در پیش داره (9 سال پیش)
0 0
شاید منظورم رو درست نرسونده بودم،منظورم من این بود که ArrayAdapter رو داخل کلاس G تعریف کنید نه اینکه کلاس ادپتر رو داخل G تعریف کنید. فرض کنید من میخوام بعد کلیک شدن رویه یکی از ایتم های لیست ویو تغییراتی ایجاد کنم.شما چطور میتونید تویه کلاس ادپتر ، ادپتر رو بلافاصله بعد کلیک شدن روی ایتم مورد نظر آپدیت کنید ؟ پس حتما برای آپدیت شدن ادپتر باید ArrayAdapter رو تویه کلاسی مثل G تعریف کنیم. (9 سال پیش)
0 0
خیر این کار هم اشتباهه. حتما نباید استاتیک باشه. شما میتونید آرایه ای که در آداپتر وجود داره رو تغییر بدید و notify کنید. استفاده از مقادیر استاتیک در این موارد کار اشتباهیه، چون توی حافظه میمونه و احتمال زیادی داره که پاک بشه و nullpointer بگیرید. (9 سال پیش)
0 0
اگه تویه کلاس G قسمت ArrayAdapter رو تعریف نکنیم پس شما چه طور میتونید از داخل کلاس ادپتر ArrayAdapter را آپدیت کنید ؟ بعدشم من تویه اکثر پروژه هام این کارو انجام میدم تا به حال هم مشکلی پیش نیومده. (9 سال پیش)
0 0
من با این جوابا هی گیج تر میشم یه کمک درست و حسابی بکنید من الان چند روزه که نمی دونم چکار کنم پروژه م تعطیل شده دانش من توی همین اندازه فعلا (9 سال پیش)
پاسخ به سوال 
Shadow  9 سال پیش
0 0

این کد آداپتر ویرایش شده هست که لیستنر تعریف کردیم :

public class RingtoneAdapter extends RecyclerView.Adapter<RingtoneAdapter.RingtoneViewHolder> {
private Context context;
private List<RingtoneItem> ringtoneItems;
private RingtoneItem ringtoneItem;
private ItemClickCallBack itemClickCallBack;


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, final int position) {
ringtoneItem = ringtoneItems.get(position);
//holder.downloadCount.setText(String.valueOf(position + 1) + "+ " + ringtoneItem.getId());

if (ringtoneItem.isFav()) {
holder.play.setImageResource(R.mipmap.ic_pause_circle_filled_black_24dp);
} else {
holder.play.setImageResource(R.mipmap.ic_play_circle_filled_black_24dp);
}


}

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


/*public void setListData(ArrayList<RingtoneItem> listData){
this.ringtoneItems.clear();
this.ringtoneItems.addAll(listData);
}*/
public interface ItemClickCallBack {
void onPlayClick(int p) throws IOException;
}
public void setItemClickCallBack( final ItemClickCallBack itemClickCallBack){
this.itemClickCallBack = itemClickCallBack;
}

public class RingtoneViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
TextView downloadCount;
ImageView play;
RelativeLayout layout;
ProgressBar progressBar;

public RingtoneViewHolder(final 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);
play.setOnClickListener(this);


}

@Override
public void onClick(View view) {
if (view.getId() == R.id.play) {
try {
itemClickCallBack.onPlayClick(getAdapterPosition());
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
 

و اینم کدهای فرگمنت هست :

 
 
public class RingtoneFragment extends Fragment {
RingtoneAdapter ringtoneAdapter;
GridLayoutManager gridLayoutManager;
RecyclerView recyclerView;
ProgressBar progressBar;
ObjectAnimator animation;
MediaPlayer mediaPlayer;
boolean stateIcon;
private ArrayList list;

public RingtoneFragment() {
// Required empty public constructor
}

public static RingtoneFragment newInstance() {

Bundle args = new Bundle();

RingtoneFragment fragment = new RingtoneFragment();
fragment.setArguments(args);
return fragment;
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_ringtone, container, false);
mediaPlayer = new MediaPlayer();
recyclerView = (RecyclerView) view.findViewById(R.id.rec_ring);
progressBar = (ProgressBar) view.findViewById(R.id.prg_ring_item);
progressBar.setVisibility(View.VISIBLE);

gridLayoutManager = new GridLayoutManager(getActivity(), 1);
// recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(gridLayoutManager);
ApiServiceRingtone apiService = new ApiServiceRingtone(getActivity());
apiService.getRingtone(new ApiServiceRingtone.OnRingtoneReceived() {
@Override
public void onReceived(final ArrayList<RingtoneItem> ringtoneItems) {
ringtoneAdapter = new RingtoneAdapter(getActivity(), ringtoneItems);
recyclerView.setAdapter(ringtoneAdapter);
ringtoneAdapter.setItemClickCallBack(new RingtoneAdapter.ItemClickCallBack() {
@Override
public void onPlayClick(int p) {
final RingtoneItem item = ringtoneItems.get(p);


if (item.isFav()) {
item.setFav(false);
if (mediaPlayer.isPlaying()) {
mediaPlayer.pause();

}


} else {
item.setFav(true);
try {
mediaPlayer.reset();
mediaPlayer.setDataSource(getActivity(), Uri.parse(item.getUrl()));
mediaPlayer.prepareAsync();
} catch (IOException e) {
e.printStackTrace();
}
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mediaPlayer) {

mediaPlayer.start();

}
});

}
//ringtoneAdapter.setListData(ringtoneItems);
ringtoneAdapter.notifyDataSetChanged();
ringtoneAdapter.notifyItemChanged(p);
}
});


}

}, 1);

return view;

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

 پاسخ صحیح

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


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