I have a Recyclerview
, and I need to display a countdown on every row.
Here is a similar question coutndown timers in listview It has a good solution , but i need that with recyclerview
It has a good solution , but i need that with recyclerview
Edit:
what i was try,here is my code Adapter
MyAdapter
:
public class AdapterItems extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private ArrayList<TopCompetitions> mListItems = new ArrayList<>();
private ImageLoader mImageLoader;
private Context context;
private Handler handler;
/******************************************/
String current_date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date d1 = null;
Date d2 = null;
long diff;
long diffSeconds;
long diffMinutes;
long diffHours;
long diffDays;
String reachableDate = "";
/******************************************/
private ScheduledFuture updateFuture;
public AdapterItems(Context context) {
this.context = context;
mImageLoader = AppController.getInstance().getImageLoader();
}
public void setmListItems(ArrayList<TopCompetitions> mListItems) {
this.mListItems = mListItems;
//update the adapter to reflect the new set of mListItems
notifyDataSetChanged();
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.
from(parent.getContext()).
inflate(R.layout.custom_horizontal_row, parent, false);
return new ItemHolder(itemView);
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
final TopCompetitions currentItem = mListItems.get(position);
final ItemHolder itemHolder = (ItemHolder) holder;
/* start_date , name_com_ar , name_com_en,
question_en,answer_ar1,answer_ar2,answer_ar3
,answer_en1,answer_en2,answer_en3,right_answer;
*/
itemHolder.item_id.setText(currentItem.getPrize_id());
itemHolder.item_description.setText(currentItem.getName_com_ar());
itemHolder.start_date.setText(currentItem.getStart_date());
itemHolder.end_date.setText(currentItem.getEnd_date());
itemHolder.name_com_ar.setText(currentItem.getName_com_ar());
itemHolder.name_com_en.setText(currentItem.getName_com_en());
itemHolder.answer_en1.setText(currentItem.getAnswer_en1());
itemHolder.answer_en2.setText(currentItem.getAnswer_en2());
itemHolder.answer_en3.setText(currentItem.getAnswer_en3());
itemHolder.answer_ar1.setText(currentItem.getAnswer_ar1());
itemHolder.answer_ar2.setText(currentItem.getAnswer_ar2());
itemHolder.answer_ar3.setText(currentItem.getAnswer_ar3());
itemHolder.right_answer.setText(currentItem.getRight_answer());
itemHolder.question_en.setText(currentItem.getQuestion_en());
itemHolder.question_ar.setText(currentItem.getQuestion_ar());
itemHolder.desc_ar.setText(currentItem.getPrize_desc_ar());
itemHolder.desc_en.setText(currentItem.getPrize_desc_en());
String urlLogo = currentItem.getPrize_pic1();
loadImages(urlLogo, itemHolder);
setDefferinceTimer(itemHolder , currentItem.getEnd_date());
if (updateFuture == null) {
final Handler mainHandler = new Handler(Looper.getMainLooper());
updateFuture = Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
setDefferinceTimer(itemHolder , currentItem.getEnd_date());
notifyDataSetChanged();
mainHandler.post(new Runnable() {
@Override
public void run() {
notifyDataSetChanged();
}
});
}
}, 0, 1000, TimeUnit.MILLISECONDS);
}
/* new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
new CountDownTimer(20000, 1000) {
public void onTick(long millisUntilFinished) {
startCountDown(itemHolder, currentItem.getEnd_date() + " 00:00:00");
notifyDataSetChanged();
}
public void onFinish() {
//counterTextView.setText("done!");
}
}.start();
}
});
*/
}
public void setDefferinceTimer(final RecyclerView.ViewHolder holder , String itemEndDate){
final ItemHolder itemHolder = (ItemHolder) holder;
current_date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
// reachableDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(itemEndDate);
try {
d1 = format.parse(current_date);
d2 = format.parse(itemEndDate+" 00:00:00");
} catch (ParseException e) {
e.printStackTrace();
}
diff = d2.getTime() - d1.getTime();
diffSeconds = diff / 1000 % 60;
diffMinutes = diff / (60 * 1000) % 60;
diffHours = diff / (60 * 60 * 1000) % 24;
diffDays = diff / (24 * 60 * 60 * 1000);
itemHolder.days_tf.setText(""+diffDays);
itemHolder.hours_tf.setText(""+diffHours);
itemHolder.minutes_tf.setText(""+diffMinutes);
itemHolder.seconds_tf.setText(""+diffSeconds);
}
private void loadImages(String urlThumbnail, final RecyclerView.ViewHolder holder) {
final ItemHolder itemHolder = (ItemHolder) holder;
mImageLoader.get(urlThumbnail, new ImageLoader.ImageListener() {
@Override
public void onResponse(ImageLoader.ImageContainer response, boolean isImmediate) {
itemHolder.item_image.setImageBitmap(response.getBitmap());
//holder.salon_gender.setImageBitmap(response.getBitmap());
}
@Override
public void onErrorResponse(VolleyError error) {
}
});
}
@Override
public int getItemCount() {
return mListItems.size();
}
private class ItemHolder extends RecyclerView.ViewHolder {
public TextView item_id, item_description, end_date,
start_date, name_com_ar, name_com_en, question_ar,
question_en, answer_ar1, answer_ar2, answer_ar3, answer_en1,
answer_en2, answer_en3, right_answer , desc_ar , desc_en;
public TextView days_tf, hours_tf, minutes_tf, seconds_tf;
public CircleImageView item_image;
public ItemHolder(View itemView) {
super(itemView);
start_date = (TextView) itemView.findViewById(R.id.start_date);
end_date = (TextView) itemView.findViewById(R.id.end_date);
name_com_ar = (TextView) itemView.findViewById(R.id.name_com_ar);
name_com_en = (TextView) itemView.findViewById(R.id.name_com_en);
question_en = (TextView) itemView.findViewById(R.id.question_en);
question_ar = (TextView) itemView.findViewById(R.id.question_ar);
desc_ar = (TextView) itemView.findViewById(R.id.desc_ar);
desc_en = (TextView) itemView.findViewById(R.id.desc_en);
answer_ar1 = (TextView) itemView.findViewById(R.id.answer_ar1);
answer_ar2 = (TextView) itemView.findViewById(R.id.answer_ar2);
answer_ar3 = (TextView) itemView.findViewById(R.id.answer_ar3);
answer_en1 = (TextView) itemView.findViewById(R.id.answer_en1);
answer_en2 = (TextView) itemView.findViewById(R.id.answer_en2);
answer_en3 = (TextView) itemView.findViewById(R.id.answer_en3);
right_answer = (TextView) itemView.findViewById(R.id.right_answer);
item_id = (TextView) itemView.findViewById(R.id.item_id);
item_description = (TextView) itemView.findViewById(R.id.item_description);
item_image = (CircleImageView) itemView.findViewById(R.id.item_image);
days_tf = (TextView) itemView.findViewById(R.id.days_tf);
hours_tf = (TextView) itemView.findViewById(R.id.hours_tf);
minutes_tf = (TextView) itemView.findViewById(R.id.minutes_tf);
seconds_tf = (TextView) itemView.findViewById(R.id.seconds_tf);
}
}
The Simple Solution Would Be:
Note: 1.holder is the object of ViewHolder class
2.Create a class UpdateTimerThread implements Runnable
3.Convert Date and Time to long and store into lgetCreatedTime
4.Run Handler for every 1 Sec to tick the Time
Here you can check and download the source code of Countdown timers in a RecyclerView
activity_main.xml
adapter_layout.xml
MainActivity.java
Custom Adapter:
Add a
CountDownTimer
member in theViewHolder
. IngetView()
set and start the counter, and don't forget to cancel any existing one in the same instance ofViewHolder
. InonTick()
you need to update the value on the display, not start the counter.You can create CountDownTimer reference in ViewHolder class and create its instance in onBindViewHolder method of Adapter.
It works perfectly.
Tested Myself.