Back to project page Resonos-Android-Framework.
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.
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 } }