Skip to content

Instantly share code, notes, and snippets.

@dineshmm23
Created August 12, 2019 06:43
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dineshmm23/926caf0a4cf7326992afc8ee3e651a21 to your computer and use it in GitHub Desktop.
Save dineshmm23/926caf0a4cf7326992afc8ee3e651a21 to your computer and use it in GitHub Desktop.
FlexibleAdapter
public void createExpandableSectionsDatabaseTest(int size) {
databaseType = DatabaseType.EXPANDABLE_SECTIONS;
mItems.clear();
for (int i = 0; i < size; i++) {
mItems.add(newExpandableSectionItemTest(i + 1));//With expansion level 0
}
}
public static ExpandableHeaderItemTest newExpandableSectionItemTest(int i) {
ExpandableHeaderItemTest expandableItem = new ExpandableHeaderItemTest("EH" + i);
expandableItem.setTitle("Expandable Header " + i);
for (int j = 1; j <= SUB_ITEMS; j++) {
SubItemTest subItem = new SubItemTest(expandableItem.getId() + "-SB" + j, expandableItem);
subItem.setTitle("Sub Item " + j);
// NOTE: In case you want to retrieve the parent, you can implement ISectionable
// then, assign the Header: ExpandableHeaderItem instance.
//subItem.setHeader(expandableItem);
}
return expandableItem;
}
package eu.davidea.samples.flexibleadapter.items;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
import eu.davidea.flexibleadapter.FlexibleAdapter;
import eu.davidea.flexibleadapter.Payload;
import eu.davidea.flexibleadapter.items.AbstractExpandableHeaderItem;
import eu.davidea.flexibleadapter.items.IExpandable;
import eu.davidea.flexibleadapter.items.IFlexible;
import eu.davidea.flexibleadapter.items.IHeader;
import eu.davidea.samples.flexibleadapter.R;
import eu.davidea.samples.flexibleadapter.items.ExpandableHeaderItem.ExpandableHeaderViewHolder;
import eu.davidea.viewholders.ExpandableViewHolder;
/**
* This is an experiment to evaluate how a Section with header can also be expanded/collapsed.
* <p>Here, it still benefits of the common fields declared in AbstractItem.</p>
* It's important to note that, the ViewHolder must be specified in all &lt;diamond&gt; signature.
*/
public class ExpandableHeaderItemTest
extends AbstractExpandableHeaderItem<ExpandableHeaderItemTest.ExpandableHeaderViewHolder, SubItemTest> {
public String getId() {
return id;
}
private final String id;
/* Flags for FlexibleAdapter */
private boolean mExpanded = false;
public void setTitle(String title) {
this.title = title;
}
private String title;
public ExpandableHeaderItemTest(String id) {
setDraggable(true);
//We start with header shown and expanded
setHidden(false);
setExpanded(true);
//NOT selectable (otherwise ActionMode will be activated on long click)!
setSelectable(false);
this.id = id;
}
@Override
public boolean isExpanded() {
return mExpanded;
}
@Override
public void setExpanded(boolean expanded) {
mExpanded = expanded;
}
@Override
public int getExpansionLevel() {
return 0;
}
@Override
public boolean equals(Object inObject) {
if (inObject instanceof ExpandableHeaderItemTest) {
ExpandableHeaderItemTest inItem = (ExpandableHeaderItemTest) inObject;
return this.id.equals(inItem.id);
}
return false;
}
@Override
public int getSpanSize(int spanCount, int position) {
return spanCount;
}
@Override
public int getLayoutRes() {
return R.layout.recycler_expandable_header_item;
}
@Override
public ExpandableHeaderViewHolder createViewHolder(View view, FlexibleAdapter<IFlexible> adapter) {
return new ExpandableHeaderViewHolder(view, adapter);
}
@Override
public void bindViewHolder(FlexibleAdapter<IFlexible> adapter, ExpandableHeaderViewHolder holder, int position, List<Object> payloads) {
if (payloads.size() > 0) {
Log.d(this.getClass().getSimpleName(), "ExpandableHeaderItem Payload " + payloads + " - " + getTitle());
} else {
Log.d(this.getClass().getSimpleName(), "ExpandableHeaderItem NoPayload - " + getTitle());
holder.mTitle.setText(getTitle());
}
String subtitle = (String.format("%s subItems %s(%s)",
countFilteredChildren(adapter),
(adapter.hasFilter() ? "found " : ""),
(isExpanded() ? "expanded" : "collapsed")));
holder.mSubtitle.setText(subtitle);
}
private String getTitle() {
return title;
}
private int countFilteredChildren(FlexibleAdapter<IFlexible> adapter) {
if (adapter.hasFilter()) {
String filter = adapter.getFilter(String.class);
int size = 0;
for (SubItemTest s : mSubItems) {
if (s.filter(filter)) size++;
}
return size;
}
return adapter.getCurrentChildren(this).size();
}
/**
* Provide a reference to the views for each data item.
* Complex data labels may need more than one view per item, and
* you provide access to all the views for a data item in a view holder.
*/
static class ExpandableHeaderViewHolder extends ExpandableViewHolder {
TextView mTitle;
TextView mSubtitle;
ImageView mHandleView;
ExpandableHeaderViewHolder(View view, FlexibleAdapter adapter) {
super(view, adapter, true);//True for sticky
mTitle = view.findViewById(R.id.title);
mSubtitle = view.findViewById(R.id.subtitle);
this.mHandleView = view.findViewById(R.id.row_handle);
if (adapter.isHandleDragEnabled()) {
this.mHandleView.setVisibility(View.VISIBLE);
setDragHandleView(mHandleView);
} else {
this.mHandleView.setVisibility(View.GONE);
}
}
}
@Override
public String toString() {
return "ExpandableHeaderItem[" + super.toString() + "//SubItems" + mSubItems + "]";
}
}
package eu.davidea.samples.flexibleadapter.items;
import android.animation.Animator;
import android.content.Context;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import java.util.List;
import eu.davidea.flexibleadapter.FlexibleAdapter;
import eu.davidea.flexibleadapter.helpers.AnimatorHelper;
import eu.davidea.flexibleadapter.items.AbstractSectionableItem;
import eu.davidea.flexibleadapter.items.IFilterable;
import eu.davidea.flexibleadapter.items.IFlexible;
import eu.davidea.flexibleadapter.items.IHeader;
import eu.davidea.flexibleadapter.utils.FlexibleUtils;
import eu.davidea.samples.flexibleadapter.R;
import eu.davidea.viewholders.FlexibleViewHolder;
/**
* If you don't have many fields in common better to extend directly from
* {@link eu.davidea.flexibleadapter.items.AbstractFlexibleItem} to benefit of the already
* implemented methods (getter and setters).
*/
public class SubItemTest extends AbstractSectionableItem<SubItemTest.ChildViewHolder, ExpandableHeaderItemTest> implements IFilterable<String> {
private final String id;
/**
* The header of this item
*/
ExpandableHeaderItemTest header;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
String title;
public SubItemTest(String id, ExpandableHeaderItemTest header) {
super(header);
setDraggable(true);
this.id=id;
}
@Override
public boolean equals(Object inObject) {
if (inObject instanceof SubItemTest) {
SubItemTest inItem = (SubItemTest) inObject;
return this.id.equals(inItem.id);
}
return false;
}
@Override
public int getLayoutRes() {
return R.layout.recycler_sub_item;
}
@Override
public ChildViewHolder createViewHolder(View view, FlexibleAdapter adapter) {
return new ChildViewHolder(view, adapter);
}
@Override
public void bindViewHolder(FlexibleAdapter<IFlexible> adapter, ChildViewHolder holder, int position, List<Object> payloads) {
//In case of searchText matches with Title or with an SimpleItem's field
// this will be highlighted
if (adapter.hasFilter()) {
Context context = holder.itemView.getContext();
String filter = adapter.getFilter(String.class);
FlexibleUtils.highlightText(holder.mTitle, getTitle(), filter,
context.getResources().getColor(R.color.colorAccent_light));
} else {
holder.mTitle.setText(getTitle());
}
}
@Override
public boolean filter(String constraint) {
return getTitle() != null && getTitle().toLowerCase().trim().contains(constraint);
}
/**
* Provide a reference to the views for each data item.
* Complex data labels may need more than one view per item, and
* you provide access to all the views for a data item in a view holder.
*/
static final class ChildViewHolder extends FlexibleViewHolder {
public ImageView mHandleView;
public TextView mTitle;
public ChildViewHolder(View view, FlexibleAdapter adapter) {
super(view, adapter);
this.mTitle = view.findViewById(R.id.title);
this.mHandleView = view.findViewById(R.id.row_handle);
if (adapter.isHandleDragEnabled()) {
this.mHandleView.setVisibility(View.VISIBLE);
setDragHandleView(mHandleView);
} else {
this.mHandleView.setVisibility(View.GONE);
}
}
@Override
public float getActivationElevation() {
return eu.davidea.utils.Utils.dpToPx(itemView.getContext(), 4f);
}
@Override
public void scrollAnimators(@NonNull List<Animator> animators, int position, boolean isForward) {
AnimatorHelper.scaleAnimator(animators, itemView, 0f);
}
}
@Override
public String toString() {
return "SubItem[" + super.toString() + "]";
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment