riteshakya037/CustomFormViews

View on GitHub
customfieldviews/src/main/java/com/ritesh/customfieldviews/CustomSpinnerView.java

Summary

Maintainability
A
1 hr
Test Coverage
package com.ritesh.customfieldviews;

import android.content.Context;
import android.content.res.TypedArray;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.LinearLayout;
import android.widget.Spinner;
import android.widget.TextView;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import butterknife.OnItemSelected;
import butterknife.Optional;
import com.ritesh.customfieldviews.adaptors.NothingSelectedSpinnerAdapter;
import com.ritesh.customfieldviews.models.BaseSpinner;
import com.ritesh.customfieldviews.validators.ValidityBase;
import com.ritesh.customfieldviews.validators.ValidityListener;
import java.util.ArrayList;
import java.util.List;

/**
 * @author Ritesh Shakya
 */
@SuppressWarnings("WeakerAccess") public class CustomSpinnerView extends LinearLayout
        implements ValidityBase {
    @BindView(R2.id.custom_spinner_view_text_hint_layout) protected ViewGroup txtHintLayout;
    @BindView(R2.id.custom_spinner_view_text_hint) protected TextView txtHint;
    @BindView(R2.id.custom_spinner_view_spinner_main) protected Spinner mSpinner;
    private Context mContext;
    private String mHint;
    private List<BaseSpinner> mData = new ArrayList<>();
    private SpinnerListener<BaseSpinner> mListener;
    private ValidityListener mValidityListener;
    private boolean mValidity;

    public CustomSpinnerView(Context context) {
        super(context);
        init(context, "", new CharSequence[] {});
    }

    public CustomSpinnerView(Context context, AttributeSet attrs) {
        super(context, attrs);
        TypedArray typedArray = getContext().obtainStyledAttributes(attrs, R.styleable.custom_view);
        init(context, typedArray.getString(R.styleable.custom_view_hint),
                typedArray.getTextArray(R.styleable.custom_view_android_entries));
        typedArray.recycle();
    }

    @Optional @OnClick(R2.id.custom_spinner_view_root_view) protected void onClickDrop() {
        if (mSpinner != null) {
            mSpinner.performClick();
        }
    }

    @Optional @OnItemSelected(R2.id.custom_spinner_view_spinner_main)
    protected void onItemSelected(int position) {
        if (position > 0 && txtHintLayout != null) {
            mValidity = true;
            txtHintLayout.setVisibility(VISIBLE);
            if (mListener != null) {
                mListener.getSpinnerValidity(CustomSpinnerView.this, mData.get(position - 1));
            }
            if (mValidityListener != null) mValidityListener.checkValidity();
        }
    }

    private void init(Context context, String hint, CharSequence[] textArray) {
        mContext = context;
        mHint = hint;

        View rootView = inflate(context, R.layout.custom_spinner_view, this);
        ButterKnife.bind(this, rootView);

        ArrayAdapter<BaseSpinner> adapter;
        if (textArray != null && textArray.length > 0) {
            for (CharSequence sequence : textArray) {
                mData.add(new BaseSpinner(sequence.toString(),
                        sequence.toString().equals("0") ? "None" : sequence.toString()));
            }
            adapter = new ArrayAdapter<>(mContext, R.layout.spinner_row_selected, mData);
            adapter.setDropDownViewResource(R.layout.spinner_row_dropdown);
            if (mSpinner != null) {
                mSpinner.setAdapter(new NothingSelectedSpinnerAdapter(adapter,
                        R.layout.spinner_row_nothing_selected, context, hint));
            }
        }
        if (txtHint != null) txtHint.setText(hint);
        if (txtHintLayout != null) txtHintLayout.setVisibility(GONE);
    }

    @SuppressWarnings("ConstantConditions") public void setData(List<BaseSpinner> data) {
        mData = data;
        ArrayAdapter<BaseSpinner> adapter =
                new ArrayAdapter<>(mContext, R.layout.spinner_row_selected, data);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        mSpinner.setAdapter(
                new NothingSelectedSpinnerAdapter(adapter, R.layout.spinner_row_nothing_selected,
                        mContext, mHint));
    }

    @SuppressWarnings("ConstantConditions") public void setSelection(String id) {
        if (!TextUtils.isEmpty(id) && mData.contains(new BaseSpinner(id, ""))) {
            int pos = mData.indexOf(new BaseSpinner(id, ""));
            mSpinner.setSelection(pos + 1);
            onItemSelected(pos + 1);
        }
    }

    public void addListener(SpinnerListener<BaseSpinner> listener,
            ValidityListener validityListener) {
        this.mListener = listener;
        mValidityListener = validityListener;
    }

    @SuppressWarnings("ConstantConditions") public BaseSpinner getValue() {
        return mSpinner.getSelectedItem() == null ? new BaseSpinner("", "")
                : (BaseSpinner) (mSpinner.getSelectedItem());
    }

    @Override public boolean getValidity() {
        return mValidity;
    }

    @Override public void setValidity(boolean validity) {
        this.mValidity = validity;
        if (mValidityListener != null) mValidityListener.checkValidity();
    }

    @Override public void reset() {
        mSpinner.setSelection(0);
        txtHintLayout.setVisibility(GONE);
        mValidity = false;
    }

    public interface SpinnerListener<T extends BaseSpinner> {
        void getSpinnerValidity(CustomSpinnerView view, T baseSpinner);
    }
}