Android Open Source - HydraListAndroid Hydra List Adapter






From Project

Back to project page HydraListAndroid.

License

The source code is released under:

Apache License

If you think the Android project HydraListAndroid listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

package com.fada21.android.hydralist;
//from w w w  . j  a  va  2 s. c  om
import android.database.Cursor;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.BaseAdapter;
import android.widget.ListView;

import com.fada21.android.hydralist.data.HydraListDataProvider;
import com.fada21.android.hydralist.data.HydraListItem;
import com.fada21.android.hydralist.dragable.DragableAdapterHelper;
import com.fada21.android.hydralist.dragable.interfaces.DragableListItem;
import com.fada21.android.hydralist.expandable.ExpandingAdapterHelper;
import com.fada21.android.hydralist.expandable.interfaces.ExpandableListItem;
import com.fada21.android.hydralist.helper.HydraListAdapterHelper;
import com.fada21.android.hydralist.helper.HydraListViewHolder;
import com.fada21.android.hydralist.helper.PlainAdapterHelper;
import com.fada21.android.hydralist.util.HydraListConsts;

/**
 * 
 * <p>
 * Adapter for {@link HydraListView}. It works as container for various behaviors implemented in helpers which extends {@link HydraListAdapterHelper}.
 * </p>
 * <p>
 * Adapter class cannot be extended. In order to extends adapter and implement extra views, animations or behavior one must extends one of the helpers which is
 * pass on to the builder.
 * </p>
 * <p>
 * In order to add extra list behavior in a modularized way please add a helper and change relevant parts in {@link HydraListView} class.
 * </p>
 * 
 * @param <T>
 */
public final class HydraListAdapter<T extends HydraListItem> extends BaseAdapter {

  protected final HydraListDataProvider<T> dataProvider;

  protected final int itemLayout;

  private final PlainAdapterHelper<T> plainAdapterHelper;
  protected final ExpandingAdapterHelper<ExpandableListItem> expandingHelper;
  protected final DragableAdapterHelper<DragableListItem> dragableHelper;

  @SuppressWarnings("unchecked")
  private HydraListAdapter(Builder<T> b) {
    dataProvider = b.dataProvider;

    itemLayout = b.baseAdapterHelper.getItemLayout();

    plainAdapterHelper = b.baseAdapterHelper;
    expandingHelper = b.expandingAdapterHelper;
    dragableHelper = b.dragableAdapterHelper;

    ensureCompliance((HydraListAdapterHelper<T>) plainAdapterHelper, (HydraListAdapterHelper<T>) expandingHelper,
        (HydraListAdapterHelper<T>) dragableHelper);
  }

  /**
   * Initiates builder for adapter
   * 
   * @param <BT>
   *            generic parameter for {@link Builder}
   * 
   * @param itemLayout
   *            - layout to inflate for the view
   * @param clazz
   *            only for parameterization
   * @return HydraBuilder for constructing HydraList Adapter
   */
  public static <BT extends HydraListItem> Builder<BT> builder(PlainAdapterHelper<BT> baseAdapterHelper) {
    return new Builder<BT>(baseAdapterHelper);
  }

  public static class Builder<BT extends HydraListItem> {

    private HydraListDataProvider<BT> dataProvider;

    private PlainAdapterHelper<BT> baseAdapterHelper = null;
    private ExpandingAdapterHelper<ExpandableListItem> expandingAdapterHelper = null;
    private DragableAdapterHelper<DragableListItem> dragableAdapterHelper = null;

    public Builder(PlainAdapterHelper<BT> helper) {
      this.baseAdapterHelper = helper;
    }

    public Builder<BT> data(HydraListDataProvider<BT> dataProvider) {
      this.dataProvider = dataProvider;
      return this;
    }

    public Builder<BT> data(Cursor cursor) {
      throw new IllegalArgumentException("Cursors not yet supported");
    }

    @SuppressWarnings("unchecked")
    public Builder<BT> expandable(ExpandingAdapterHelper<? extends ExpandableListItem> helper) {
      expandingAdapterHelper = (ExpandingAdapterHelper<ExpandableListItem>) helper;
      return this;
    }

    @SuppressWarnings("unchecked")
    public Builder<BT> dragable(DragableAdapterHelper<? extends DragableListItem> helper) {
      dragableAdapterHelper = (DragableAdapterHelper<DragableListItem>) helper;
      return this;
    }

    public HydraListAdapter<BT> build() {
      return new HydraListAdapter<BT>(this);
    }

  }

  // ====== Behavior switchers =================================

  // ====== basic plain adapter helper, must be present ========
  public PlainAdapterHelper<T> getPlainAdapterHelper() {
    return plainAdapterHelper;
  }

  // ====== expanding functionality ============================
  public boolean isExpandable() {
    return expandingHelper != null;
  }

  public ExpandingAdapterHelper<ExpandableListItem> getExpandingHelper() {
    return expandingHelper;
  }

  // ====== dragable functionality =============================
  public boolean isDragable() {
    return dragableHelper != null;
  }

  public DragableAdapterHelper<DragableListItem> getDragableHelper() {
    return dragableHelper;
  }

  /**
   * Checks for general compliance, and if helpers are properly initialized. Therefore should be invoked after object was built.
   * 
   * @param helpers
   */
  private void ensureCompliance(HydraListAdapterHelper<T>... helpers) throws IllegalStateException {
    if (plainAdapterHelper == null) {
      throw new IllegalStateException("BaseAdapterHelper instance must be provided!");
    }

    if (helpers.length > 1) {
      for (HydraListAdapterHelper<T> hydraAdapterHelper : helpers) {
        if (hydraAdapterHelper != null) {
          hydraAdapterHelper.ensureCompliance(dataProvider);
        }
      }
    }

  }

  public HydraListDataProvider<T> getDataProvider() {
    return dataProvider;
  }

  /**
   * Important to force that in data set {@link HydraListDataProvider}
   */
  @Override
  public boolean hasStableIds() {
    return true;
  }

  @Override
  public int getCount() {
    return dataProvider.size();
  }

  @Override
  public T getItem(int position) {
    return dataProvider.get(position);
  }

  @Override
  public long getItemId(int position) {
    if (position < 0 || position >= dataProvider.size()) {
      return HydraListConsts.INVALID_ID;
    } else {
      return dataProvider.get(position).getId();
    }
  }

  /*
   * Standard getView method. It's very important for new plugins to change it wisely.
   * 
   * @see android.widget.Adapter#getView(int, android.view.View, android.view.ViewGroup)
   */
  @Override
  public View getView(int position, View convertView, ViewGroup parent) {
    final T data = dataProvider.get(position);

    boolean isConvertViewNullAtFirst = convertView == null;
    boolean doAlwaysRecreateConvertView = plainAdapterHelper.getItemLayout() == HydraListConsts.UNSET;

    if (!doAlwaysRecreateConvertView) {

      if (isConvertViewNullAtFirst) {
        convertView = plainAdapterHelper.newView(parent);
      }
      if (plainAdapterHelper.hasViewHolderClass()) {
        plainAdapterHelper.bindView((HydraListViewHolder) convertView.getTag(itemLayout), data);
      } else {
        plainAdapterHelper.setupPlainView(parent, convertView, data);
      }
    } else {
      plainAdapterHelper.setupPlainView(parent, null, data);
    }

    if (isExpandable()) {
      if (isConvertViewNullAtFirst) {
        expandingHelper.storeExpandableViewHolderAsTag(convertView);
      }
      expandingHelper.getExpandedView(convertView, (ExpandableListItem) data);
    }

    int layout_width = AbsListView.LayoutParams.MATCH_PARENT;
    int layout_height = AbsListView.LayoutParams.WRAP_CONTENT;
    convertView.setLayoutParams(new ListView.LayoutParams(layout_width, layout_height));

    return convertView;
  }

}




Java Source Code List

com.fada21.android.hydralist.HydraListAdapter.java
com.fada21.android.hydralist.HydraListView.java
com.fada21.android.hydralist.data.HydraListDataProvider.java
com.fada21.android.hydralist.data.HydraListItem.java
com.fada21.android.hydralist.data.ListDataProvider.java
com.fada21.android.hydralist.dragable.DragableAdapterHelper.java
com.fada21.android.hydralist.dragable.DragableConsts.java
com.fada21.android.hydralist.dragable.DragableListViewDelegate.java
com.fada21.android.hydralist.dragable.interfaces.DragableListItem.java
com.fada21.android.hydralist.dragable.interfaces.OnItemMovedListener.java
com.fada21.android.hydralist.dragable.interfaces.Swappable.java
com.fada21.android.hydralist.expandable.BasicExpandableListItem.java
com.fada21.android.hydralist.expandable.ExpandableViewHolder.java
com.fada21.android.hydralist.expandable.ExpandingAdapterHelper.java
com.fada21.android.hydralist.expandable.ExpandingLayout.java
com.fada21.android.hydralist.expandable.ExpandingListViewDelegate.java
com.fada21.android.hydralist.expandable.interfaces.ExpandableListItem.java
com.fada21.android.hydralist.expandable.interfaces.OnSizeChangedListener.java
com.fada21.android.hydralist.helper.HydraListAdapterHelper.java
com.fada21.android.hydralist.helper.HydraListViewHolder.java
com.fada21.android.hydralist.helper.PlainAdapterHelper.java
com.fada21.android.hydralist.sample.CustomExpandingAdapterHelper.java
com.fada21.android.hydralist.sample.SampleConsts.java
com.fada21.android.hydralist.sample.SampleContents.java
com.fada21.android.hydralist.sample.SampleDataProvider.java
com.fada21.android.hydralist.sample.SampleHydraListActivity.java
com.fada21.android.hydralist.sample.SampleListItem.java
com.fada21.android.hydralist.sample.SamplePlainAdapterHelper.java
com.fada21.android.hydralist.sample.SampleViewHolder.java
com.fada21.android.hydralist.util.HydraListConsts.java
com.fada21.android.hydralist.util.HydraListUtils.java
com.fada21.android.hydralist.util.PublicListView.java