Android Open Source - Resonos-Android-Framework List Form Builder






From Project

Back to project page Resonos-Android-Framework.

License

The source code is released under:

Apache License

If you think the Android project Resonos-Android-Framework 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.resonos.apps.library.widget;
/*from  ww  w .  ja v  a2s  .c  om*/
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;

import android.content.Context;
import android.graphics.Color;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.ViewParent;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import android.widget.ScrollView;
import android.widget.TextView;

import com.resonos.app.library.R;
import com.resonos.apps.library.App;
import com.resonos.apps.library.widget.FormElement.FormElementData;

/**
 * This is the most basic but complete implementation of {@link FormBuilder}.
 * It uses a ScrollView with a single vertical LinearLayout to host all of
 *  the form items.
 * @author Chris
 */
public class ListFormBuilder extends FormBuilder implements OnClickListener {

  // objects
  private ScrollView mScrollView;
  private LinearLayout mItemContainer;
  private OnFormItemClickListener mListener;
  private Map<Enum<?>,FormElement> mElements;
  private ArrayList<FormElement> mData;
  
  /**
   * Specific item click listener for this implementation
   */
  public interface OnFormItemClickListener {
    public void onClick(Enum<?> item, int pos, FormElement fe);
  }
  
  /**
   * Create a List implementation of a {@link FormBuilder}
   * It does not actually use a listview, rather, it uses a scrolling linearlayout
   * @param cx : context
   * @param inState : the state, or null
   * @param cl : a listener for clicks, or null
   */
  public ListFormBuilder(Context cx, Bundle inState, OnFormItemClickListener cl) {
    super(cx, inState);
    mListener = cl;
    mData = new ArrayList<FormElement>();
    mElements = new HashMap<Enum<?>,FormElement>();
    create();
  }

  @Override
  public View getListItem(Enum<?> key) {
    return null;
  }
  
  @Override
  public void clear() {
    mData.clear();
    mElements.clear();
  }

  @Override
  protected View start() {
    mScrollView = new ScrollView(getContext());
    mItemContainer = new LinearLayout(getContext());
    mItemContainer.setOrientation(LinearLayout.VERTICAL);
    mScrollView.addView(mItemContainer, new ViewGroup.LayoutParams(
        LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
    return mScrollView;
  }

  @Override
  public void onClick(View v) {
    Object o = v.getTag();
    if (o != null && o instanceof ViewHolder) {
      Enum<?> e = ((ViewHolder)o).tag;
      if (e != null)
        onClick(e);
    }
  }
  
  @Override
  protected void onClick(Enum<?> a) {
    if (mListener != null) {
      mListener.onClick(a, mElements.get(a).getData().mIndex, mElements.get(a));
    }
  }

  @Override
  protected View startSection() {
    return null;
  }

  @Override
  protected View startSection(CharSequence s) {
    FormElement fe = new FormElement(this);
    fe.setAsHeader(s);
    mData.add(fe);
    return null;
  }

  @Override
  protected void addItem(FormElement fe) {
    mData.add(fe);
  }

  @Override
  protected void endSection() {
    //
  }

  @Override
  protected void end() {
    mItemContainer.removeAllViewsInLayout();
    for (int i = 0; i < mData.size(); i++) {
      View v = getView(mData.get(i));
      boolean div = mData.get(i).getData().mDivider;
      LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
          LayoutParams.MATCH_PARENT, div ? App.inDP(1) : LayoutParams.WRAP_CONTENT);
      mItemContainer.addView(v, lp);
    }
  }
  
  /**
   * Create a view based on a FormElement data object
   * @param e : the {@link FormElement} description of the view to be created
   * @return the view created
   */
    public View getView(FormElement e) {
      View v = null;
    RowType rt = e.getData().mDivider ? RowType.SEPARATOR : RowType.ROW;
    
    switch (rt) {
    case SEPARATOR:
      if (v == null) {
        LayoutInflater vi = (LayoutInflater)getContext()
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = vi.inflate(R.layout.list_item_separator, mItemContainer, false);
      }
      break;
    case ROW:
      if (v == null) {
        LayoutInflater vi = (LayoutInflater)getContext()
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = vi.inflate(R.layout.list_item_form, mItemContainer, false);
        
        ViewHolder vh = new ViewHolder();
          vh.iv = ((ImageView) v.findViewById(R.id.image));
          vh.ivCon = ((FrameLayout) v.findViewById(R.id.image_container));
          vh.cat = ((TextView) v.findViewById(R.id.cat));
          vh.title = ((TextView) v.findViewById(R.id.title));
          vh.subt = ((TextView) v.findViewById(R.id.subtitle));
          vh.itemContainer = (LinearLayout)v
                .findViewById(R.id.main_container);
          
          v.setTag(vh);
      }
      setupBasicItem(v, e);
    }
    return v;
  }
    
    /**
     * Sets up a non-separator item based on data
     * @param view : the view
     * @param item : the data
     */
  private void setupBasicItem(View view, FormElement item) {
    FormElementData data = item.getData();

    ViewHolder vh = (ViewHolder)view.getTag();
    if (data.mTag != null) {
      vh.tag = (data.mTag);
      mElements.put(data.mTag, item);
    } else {
      vh.tag = (null);
    }
    
    view.setBackgroundResource(data.mClickable ? R.drawable.list_selector_holo_dark : 0);
    view.setOnClickListener(data.mClickable ? this : null);
    view.setClickable(data.mClickable);

    vh.iv.setBackgroundDrawable(null);
    if (data.mView != null) {
      ViewParent vp = data.mView.getParent();
      if (vp != null && vp instanceof ViewGroup)
        ((ViewGroup)vp).removeView(data.mView);
      vh.itemContainer.removeAllViews();
      vh.itemContainer.addView(vh.cat);
      vh.itemContainer.addView(vh.title);
      vh.itemContainer.addView(vh.subt);
      vh.itemContainer.addView(data.mView,
          new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
      vh.cat.setVisibility(View.GONE);
      vh.title.setVisibility(View.GONE);
      vh.subt.setVisibility(View.GONE);
      vh.iv.setVisibility(View.GONE);
      vh.ivCon.setVisibility(View.GONE);
      return;
    } else {
      vh.itemContainer.removeAllViews();
      vh.itemContainer.addView(vh.cat);
      vh.itemContainer.addView(vh.title);
      vh.itemContainer.addView(vh.subt);
      vh.title.setVisibility(View.VISIBLE);
      vh.subt.setVisibility(View.VISIBLE);
      vh.cat.setVisibility(View.GONE);
      if (data.mIconView != null) {
        vh.iv.setVisibility(View.GONE);
        vh.ivCon.setVisibility(View.VISIBLE);
          ViewParent vp = data.mIconView.getParent();
          if (vp != null && vp instanceof ViewGroup)
            ((ViewGroup)vp).removeView(data.mIconView);
          vh.ivCon.addView(data.mIconView, 0);
        } else {
          vh.iv.setVisibility(View.VISIBLE);
          vh.ivCon.setVisibility(View.GONE);
          vh.ivCon.removeAllViews();
        }

      if (data.mHeader) {
        vh.title.setVisibility(View.GONE);
        vh.subt.setVisibility(View.GONE);
        vh.cat.setVisibility(View.VISIBLE);
          if (data.mTitle != null)
            vh.cat.setText(data.mTitle instanceof String
                ? ((String)data.mTitle).toUpperCase(Locale.US) : data.mTitle);
          else
            vh.cat.setVisibility(View.GONE);
      }
    }
    
    if (data.mIcon > -1 || data.mDrawable != null) {
      Drawable dr = item.calculateDrawableToUse(getContext());
      Rect bounds = data.mDrawableBounds;
      if (bounds != null) {
        vh.iv.getLayoutParams().width = bounds.width();
        vh.iv.getLayoutParams().height = bounds.height();
        vh.iv.requestLayout();
        vh.iv.setScaleType(ScaleType.CENTER_INSIDE);
      }
      // bug on Android 2.1 or less, does not allow using a color filter
      // on the drawable. therefore we use the background drawable instead.
      vh.iv.setBackgroundDrawable(dr);
    } else {
      vh.iv.setBackgroundDrawable(null);
      vh.iv.setVisibility(View.GONE);
    }
    
    if (data.mSubtitle != null) {
      vh.subt.setText(data.mSubtitle);
      vh.subt.setGravity(data.mGravity);
      if (data.mTextColor != Color.TRANSPARENT)
        vh.subt.setTextColor(data.mTextColor);
      else
        vh.subt.setTextColor(getContext().getResources().getColorStateList(R.color.text_color_secondary));
    } else {
      vh.subt.setVisibility(View.GONE);
    }
    ((LinearLayout) vh.title.getParent()).setGravity(data.mGravity);
    ((LinearLayout)((LinearLayout) vh.title.getParent()).getParent()).setGravity(data.mGravity);
    if (data.mTitle != null) {
      vh.title.setText(data.mTitle);
      vh.title.setGravity(data.mGravity);
      if (data.mTextColor != Color.TRANSPARENT)
        vh.title.setTextColor(data.mTextColor);
      else
        vh.title.setTextColor(getContext().getResources().getColorStateList(R.color.text_color_primary));
    } else {
      vh.title.setVisibility(View.GONE);
    }
  }
  
  /**
   * ViewHolder pattern for the list items.
   * This doesn't really optimize anything currently, but would be
   *  helpful if this class were modified to recycle views.
   */
    private static class ViewHolder {
    ImageView iv;
    FrameLayout ivCon;
    TextView cat;
    TextView title;
    TextView subt;
    LinearLayout itemContainer;
    Enum<?> tag;
    }
    
    /**
     * The types of row items in this form builder.
     */
    public enum RowType {
        ROW,
        SEPARATOR
    }
}




Java Source Code List

com.resonos.apps.library.Action.java
com.resonos.apps.library.AlertFragment.java
com.resonos.apps.library.App.java
com.resonos.apps.library.BaseFragment.java
com.resonos.apps.library.FragmentBaseActivity.java
com.resonos.apps.library.file.AltAndroidFileHandle.java
com.resonos.apps.library.file.AltAndroidFiles.java
com.resonos.apps.library.file.AltFileHandle.java
com.resonos.apps.library.file.FileCache.java
com.resonos.apps.library.media.AudioVisualizer.java
com.resonos.apps.library.media.BitmapMemoryCache.java
com.resonos.apps.library.media.HueColorFilter.java
com.resonos.apps.library.media.ImageLoader.java
com.resonos.apps.library.media.MediaScannerNotifier.java
com.resonos.apps.library.model.Coord.java
com.resonos.apps.library.model.ImmutableCoord.java
com.resonos.apps.library.tabviewpager.CustomViewPager.java
com.resonos.apps.library.tabviewpager.PageIndicator.java
com.resonos.apps.library.tabviewpager.TabPageIndicator.java
com.resonos.apps.library.tabviewpager.TabViewPagerAdapter.java
com.resonos.apps.library.tabviewpager.TabViewPagerFragment.java
com.resonos.apps.library.tabviewpager.TitleProvider.java
com.resonos.apps.library.util.AppUtils.java
com.resonos.apps.library.util.ErrorReporter.java
com.resonos.apps.library.util.LifecycleTaskQueue.java
com.resonos.apps.library.util.M.java
com.resonos.apps.library.util.NetworkClient.java
com.resonos.apps.library.util.NetworkRequest.java
com.resonos.apps.library.util.ParameterList.java
com.resonos.apps.library.util.SensorReader.java
com.resonos.apps.library.util.TouchViewWorker.java
com.resonos.apps.library.util.ViewServer.java
com.resonos.apps.library.widget.DashboardLayout.java
com.resonos.apps.library.widget.FormBuilder.java
com.resonos.apps.library.widget.FormElement.java
com.resonos.apps.library.widget.ListFormBuilder.java
com.resonos.apps.library.widget.PopupWindows3D.java
com.resonos.apps.library.widget.QuickAction3D.java
com.resonos.apps.library.widget.RangeSeekBar.java
com.resonos.apps.library.widget.SeekBar.java
com.resonos.apps.library.widget.ToolBarButton.java
com.resonos.apps.library.widget.ToolBar.java