Skip to content

Instantly share code, notes, and snippets.

@vishalhalani
Created May 16, 2018 05:59
Show Gist options
  • Save vishalhalani/093461b7fd4125358b6c729b5a9adbe7 to your computer and use it in GitHub Desktop.
Save vishalhalani/093461b7fd4125358b6c729b5a9adbe7 to your computer and use it in GitHub Desktop.
Adapter to show data like datewise (timeline) with load more feature
/**
* Created by vishal.halani on 11-May-18.
*/
public class TaskAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private final int VIEW_ITEM = 1;
private final int VIEW_PROG = 0;
// The minimum amount of items to have below your current scroll position
// before loading more.
private int visibleThreshold = 5;
private int lastVisibleItem, totalItemCount;
private boolean loading;
private OnLoadMoreListener onLoadMoreListener;
private SimpleDateFormat myDateFormat;
ArrayList<TaskModel> mList;
private Context context;
boolean isAllSelected = false;
public TaskAdapter(ArrayList<TaskModel> mList, Context context, RecyclerView recyclerView) {
this.context = context;
this.mList = mList;
myDateFormat = new SimpleDateFormat("dd/MM/yyyy", Locale.UK);
if (recyclerView.getLayoutManager() instanceof LinearLayoutManager) {
final LinearLayoutManager linearLayoutManager = (LinearLayoutManager) recyclerView
.getLayoutManager();
recyclerView
.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView,
int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
totalItemCount = linearLayoutManager.getItemCount();
lastVisibleItem = linearLayoutManager
.findLastVisibleItemPosition();
if (!loading
&& totalItemCount <= (lastVisibleItem + visibleThreshold)) {
// End has been reached
// Do something
if (onLoadMoreListener != null) {
onLoadMoreListener.onLoadMore();
}
loading = true;
}
}
});
}
}
@Override
public int getItemViewType(int position) {
return mList.get(position) != null ? VIEW_ITEM : VIEW_PROG;
}
public void setAllSelected(boolean allSelected) {
isAllSelected = allSelected;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
RecyclerView.ViewHolder vh;
if (viewType == VIEW_ITEM) {
View v = LayoutInflater.from(viewGroup.getContext()).inflate(
R.layout.item_assigned_task_layout, viewGroup, false);
vh = new ItemViewHolder(v);
;
} else {
View v = LayoutInflater.from(viewGroup.getContext()).inflate(
R.layout.footer_progressbar, viewGroup, false);
vh = new ProgressViewHolder(v);
}
return vh;
// if (viewType == TYPE_ITEM) {
// View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_assigned_task_layout, viewGroup, false);
// return new ItemViewHolder(view);
// } else if (viewType == TYPE_HEADER) {
// View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.header_layout, viewGroup, false);
// return new HeaderViewHolder(view);
//
// }
// throw new RuntimeException("there is no type that matches the type " + viewType + " + make sure your using types correctly");
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (holder instanceof ItemViewHolder) {
ItemViewHolder vholder = (ItemViewHolder) holder;
final TaskModel item = (TaskModel) mList.get(position);
//set the id to editetxt important line here as it will be helpful to set text according to position
vholder.tvTask.setId(position);
vholder.tvTask.setText(item.getTask());
// vholder.tvStartDate.setText(Const.convertServerDateToOnlyUserDate(item.getStartDate()));
// vholder.tvEndDate.setText(Const.convertServerDateToOnlyUserDate(item.getDueDate()));
showTimeLines(position, vholder, item);
if (item.getStatus().equals(Const.STATUS_COMPLETED)) {
Date startDate = Const.convertServerDateToDate(Const.convertDateToUserTimeZone(item.getStartDate()));
String planDate = myDateFormat.format(startDate);
vholder.tvPlanDate.setVisibility(View.VISIBLE);
vholder.tvPlanDate.setText("Plan "+planDate);
vholder.imgView.setVisibility(View.VISIBLE);
if (item.getDueDate() != null) {
Timber.tag("ADAPTER").i("LOG TIME=>%s", Const.getActualTimeSlot(item.getDueDate()));
// vholder.tvActual.setText(Const.getActualTimeSlot(item.getDueDate()));
switch (Const.getActualTimeSlot(item.getDueDate())) {
case "A":
Glide.with(context)
.load(R.drawable.ic_task_a)
.into(vholder.imgView);
// vholder.imgView.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_task_a));
// vholder.tvActual.setBackgroundColor(ContextCompat.getColor(context, R.color.actual_a));
break;
case "B":
Glide.with(context)
.load(R.drawable.ic_task_b)
.into(vholder.imgView);
// vholder.imgView.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_task_b));
// vholder.tvActual.setBackgroundColor(ContextCompat.getColor(context, R.color.actual_b));
break;
case "C":
Glide.with(context)
.load(R.drawable.ic_task_c)
.into(vholder.imgView);
//vholder.imgView.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_task_c));
// vholder.tvActual.setBackgroundColor(ContextCompat.getColor(context, R.color.actual_c));
break;
case "D":
Glide.with(context)
.load(R.drawable.ic_task_d)
.into(vholder.imgView);
//vholder.imgView.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_task_d));
// vholder.tvActual.setBackgroundColor(ContextCompat.getColor(context, R.color.actual_d));
break;
}
}
} else {
vholder.tvPlanDate.setVisibility(View.INVISIBLE);
try {
Glide.with(context)
.load(R.drawable.ic_edit)
.into(vholder.imgView);
} catch (Exception e) {
e.printStackTrace();
}
}
if (isAllSelected) {
if (item.getEmployee().getFullname() != null) {
vholder.tvAssigned.setVisibility(View.VISIBLE);
vholder.tvAssigned.setText(item.getEmployee().getFullname());
} else {
vholder.tvAssigned.setVisibility(View.GONE);
}
} else {
if (item.getAssignedby() != null && !item.getAssignedby().getID().equals("0")) {
vholder.tvAssigned.setVisibility(View.VISIBLE);
vholder.tvAssigned.setText(item.getAssignedby().getFullname());
} else {
vholder.tvAssigned.setVisibility(View.GONE);
}
}
} else if (holder instanceof ProgressViewHolder) {
ProgressViewHolder loadingViewHolder = (ProgressViewHolder) holder;
loadingViewHolder.progressBar.setIndeterminate(true);
}
}
public void setOnLoadMoreListener(OnLoadMoreListener onLoadMoreListener) {
this.onLoadMoreListener = onLoadMoreListener;
}
@Override
public int getItemCount() {
return mList == null ? 0 : mList.size();
}
public void setLoaded() {
loading = false;
}
public class ItemViewHolder extends RecyclerView.ViewHolder {
public View View, topView, bottomView;
public TextView tvTask, tvAssigned, tvDate, tvPlanDate;
public ImageView imgView;
public LinearLayout itemLayout, addItem, headerLayout;
public ItemViewHolder(View v) {
super(v);
View = v;
// Add your UI Components here
tvTask = (TextView) v.findViewById(R.id.task_tv);
tvDate = (TextView) v.findViewById(R.id.date_tv);
tvPlanDate = (TextView) v.findViewById(R.id.planDate_tv);
headerLayout = (LinearLayout) v.findViewById(R.id.date_headerView);
// vholder.tvActual = (TextView) v.findViewById(R.id.actual_tv);
tvAssigned = (TextView) v.findViewById(R.id.assigned_by_tv);
addItem = (LinearLayout) v.findViewById(R.id.item_layout_add_task_layout);
imgView = (ImageView) v.findViewById(R.id.add_taskView);
itemLayout = (LinearLayout) v.findViewById(R.id.item_card);
topView = (View) v.findViewById(R.id.item_layout_top_view);
bottomView = (View) v.findViewById(R.id.item_layout_bottom_view);
}
}
private void showTimeLines(int position, AssignedTaskAdapter.ItemViewHolder vholder, TaskModel item) {
if (position <= mList.size() && mList.size() != 1) {
if (position != 0 && (position != mList.size() - 1)) {
final TaskModel premodel = mList.get(position - 1);
if (mList.get(position + 1) != null) {
final TaskModel postmodel = mList.get(position + 1);
String preModelDate = Const.convertServerDateToOnlyDate(premodel.getDueDate()) == null ? "" : Const.convertServerDateToOnlyDate(premodel.getDueDate());
String postModelDate = Const.convertServerDateToOnlyDate(postmodel.getDueDate()) == null ? "" : Const.convertServerDateToOnlyDate(postmodel.getDueDate());
Log.i("TAG", "ITEM POS=>" + position);
Log.i("TAG", "Size=>" + mList.size());
String currentItemDate = Const.convertServerDateToOnlyDate(item.getDueDate());
if (!preModelDate.equals(currentItemDate) && postModelDate.equals(currentItemDate)) {
vholder.headerLayout.setVisibility(View.VISIBLE);
vholder.tvDate.setText(Const.convertServerDateToOnlyUserDateDay(item.getDueDate()));
vholder.topView.setVisibility(View.INVISIBLE);
vholder.bottomView.setVisibility(View.VISIBLE);
} else if (preModelDate.equals(currentItemDate) && postModelDate.equals(currentItemDate)) {
vholder.headerLayout.setVisibility(View.GONE);
vholder.topView.setVisibility(View.VISIBLE);
vholder.bottomView.setVisibility(View.VISIBLE);
} else if (preModelDate.equals(currentItemDate) && !postModelDate.equals(currentItemDate)) {
vholder.headerLayout.setVisibility(View.GONE);
vholder.topView.setVisibility(View.VISIBLE);
vholder.bottomView.setVisibility(View.INVISIBLE);
} else if (!preModelDate.equals(currentItemDate) && !postModelDate.equals(currentItemDate)) {
vholder.headerLayout.setVisibility(View.VISIBLE);
vholder.tvDate.setText(Const.convertServerDateToOnlyUserDateDay(item.getDueDate()));
vholder.topView.setVisibility(View.INVISIBLE);
vholder.bottomView.setVisibility(View.INVISIBLE);
}
}
} else {
if (position == 0) {
final TaskModel postmodel = mList.get(position + 1);
String postModelDate = Const.convertServerDateToOnlyDate(postmodel.getDueDate());
String currentItemDate = Const.convertServerDateToOnlyDate(item.getDueDate());
vholder.headerLayout.setVisibility(View.VISIBLE);
vholder.tvDate.setText(Const.convertServerDateToOnlyUserDateDay(item.getDueDate()));
if (postModelDate.equals(currentItemDate)) {
vholder.topView.setVisibility(View.INVISIBLE);
vholder.bottomView.setVisibility(View.VISIBLE);
} else {
vholder.topView.setVisibility(View.INVISIBLE);
vholder.bottomView.setVisibility(View.INVISIBLE);
}
} else {
final TaskModel premodel = mList.get(position - 1);
String preModelDate = Const.convertServerDateToOnlyDate(premodel.getDueDate());
String currentItemDate = Const.convertServerDateToOnlyDate(item.getDueDate());
if (preModelDate.equals(currentItemDate)) {
vholder.headerLayout.setVisibility(View.GONE);
vholder.topView.setVisibility(View.VISIBLE);
vholder.bottomView.setVisibility(View.INVISIBLE);
} else {
vholder.headerLayout.setVisibility(View.VISIBLE);
vholder.tvDate.setText(Const.convertServerDateToOnlyUserDateDay(item.getDueDate()));
vholder.topView.setVisibility(View.INVISIBLE);
vholder.bottomView.setVisibility(View.INVISIBLE);
}
}
}
} else {
vholder.headerLayout.setVisibility(View.VISIBLE);
vholder.tvDate.setText(Const.convertServerDateToOnlyUserDateDay(item.getDueDate()));
vholder.topView.setVisibility(View.INVISIBLE);
vholder.bottomView.setVisibility(View.INVISIBLE);
}
}
private class ProgressViewHolder extends RecyclerView.ViewHolder {
public ProgressBar progressBar;
public ProgressViewHolder(View v) {
super(v);
progressBar = (ProgressBar) v.findViewById(R.id.progressBar1);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment