com.justwayward.reader.view.SelectionLayout.java Source code

Java tutorial

Introduction

Here is the source code for com.justwayward.reader.view.SelectionLayout.java

Source

/**
 * Copyright 2016 JustWayward Team
 * <p>
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * <p>
 * http://www.apache.org/licenses/LICENSE-2.0
 * <p>
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.justwayward.reader.view;

import android.content.Context;
import android.support.v4.content.ContextCompat;
import android.support.v7.widget.ListPopupWindow;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.view.animation.LinearInterpolator;
import android.widget.AdapterView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.PopupWindow;
import android.widget.TextView;

import com.justwayward.reader.R;
import com.yuyh.easyadapter.abslistview.EasyLVAdapter;
import com.yuyh.easyadapter.abslistview.EasyLVHolder;

import java.util.ArrayList;
import java.util.List;

/**
 * @author yuyh.
 * @date 16/9/2.
 */
public class SelectionLayout extends LinearLayout {

    private Context mContext;
    private LinearLayout parent;

    private OnSelectListener listener;

    public SelectionLayout(Context context) {
        this(context, null);
    }

    public SelectionLayout(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public SelectionLayout(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        parent = this;
        this.mContext = context;
    }

    public void setData(List<String>... data) {
        if (data != null && data.length > 0) {
            for (int i = 0; i < data.length; i++) {
                List<String> list = data[i];
                ChildView childView = new ChildView(mContext);
                LayoutParams params = new LayoutParams(0, ViewGroup.LayoutParams.WRAP_CONTENT);
                params.weight = 1;
                childView.setLayoutParams(params);
                childView.setData(list);
                childView.setTag(i);
                addView(childView);
            }
        }
    }

    private void closeAll() {
        int childCount = getChildCount();
        for (int i = 0; i < childCount; i++) {
            ChildView childView = (ChildView) getChildAt(i);
            childView.closePopWindow();
        }
    }

    class ChildView extends LinearLayout implements OnClickListener, AdapterView.OnItemClickListener {

        private LinearLayout layout;

        private ImageView ivArrow;
        private TextView tvTitle;

        private boolean isOpen = false;

        private List<String> data = new ArrayList<>();
        private ListPopupWindow mListPopupWindow;
        private SelAdapter mAdapter;

        Animation operatingAnim1 = AnimationUtils.loadAnimation(mContext, R.anim.roate_0_180);
        Animation operatingAnim2 = AnimationUtils.loadAnimation(mContext, R.anim.roate_180_360);
        LinearInterpolator lin1 = new LinearInterpolator();
        LinearInterpolator lin2 = new LinearInterpolator();

        public ChildView(Context context) {
            this(context, null);
        }

        public ChildView(Context context, AttributeSet attrs) {
            this(context, attrs, 0);
        }

        public ChildView(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            layout = (LinearLayout) inflater.inflate(R.layout.view_selection, this);

            initView();
        }

        private void initView() {
            ivArrow = (ImageView) findViewById(R.id.ivSelArrow);
            ivArrow.setScaleType(ImageView.ScaleType.MATRIX); //required
            tvTitle = (TextView) findViewById(R.id.tvSelTitle);
            setOnClickListener(this);
            operatingAnim1.setInterpolator(lin1);
            operatingAnim1.setFillAfter(true);
            operatingAnim2.setInterpolator(lin2);
            operatingAnim2.setFillAfter(true);
        }

        private void setData(List<String> list) {
            if (list != null && !list.isEmpty()) {
                data.addAll(list);
                tvTitle.setText(list.get(0));
            }
        }

        public void openPopupWindow() {
            if (mListPopupWindow == null) {
                createPopupWindow();
            }
            mListPopupWindow.show();
        }

        private void createPopupWindow() {
            mListPopupWindow = new ListPopupWindow(mContext);
            mAdapter = new SelAdapter(mContext, data);
            mListPopupWindow.setAdapter(mAdapter);
            mListPopupWindow.setWidth(ViewGroup.LayoutParams.MATCH_PARENT);
            mListPopupWindow.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
            mListPopupWindow.setAnchorView(parent.getChildAt(0));
            mListPopupWindow.setForceIgnoreOutsideTouch(false);
            mListPopupWindow.setOnItemClickListener(this);
            mListPopupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
                @Override
                public void onDismiss() {
                    ivArrow.startAnimation(operatingAnim2);
                    isOpen = false;
                }
            });
            mListPopupWindow.setModal(true);
        }

        public void closePopWindow() {
            if (mListPopupWindow != null && mListPopupWindow.isShowing()) {
                mListPopupWindow.dismiss();
            }
        }

        @Override
        public void onClick(View v) {
            if (isOpen) {
                ivArrow.startAnimation(operatingAnim2);
                closePopWindow();
                isOpen = false;
            } else {
                ivArrow.startAnimation(operatingAnim1);
                openPopupWindow();
                isOpen = true;
            }
        }

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            mAdapter.setSelPosition(position);
            tvTitle.setText(data.get(position));
            if (listener != null) {
                listener.onSelect((Integer) this.getTag(), position, data.get(position));
            }
            mListPopupWindow.dismiss();
        }

        class SelAdapter extends EasyLVAdapter<String> {

            int selPosition = 0;

            public SelAdapter(Context context, List<String> list) {
                super(context, list, R.layout.item_selection_view);
            }

            @Override
            public void convert(EasyLVHolder holder, int position, String s) {
                holder.setText(R.id.tvSelTitleItem, s);
                if (selPosition == position) {
                    holder.setTextColor(R.id.tvSelTitleItem, ContextCompat.getColor(mContext, R.color.light_pink));
                } else {
                    holder.setTextColor(R.id.tvSelTitleItem, ContextCompat.getColor(mContext, R.color.light_black));
                }
            }

            public void setSelPosition(int position) {
                selPosition = position;
                notifyDataSetChanged();
            }
        }
    }

    public interface OnSelectListener {
        void onSelect(int index, int position, String title);
    }

    public void setOnSelectListener(OnSelectListener listener) {
        this.listener = listener;
    }
}