package com.pchmn.materialchips.views; import android.content.Context; import android.content.res.ColorStateList; import android.content.res.Configuration; import android.graphics.PorterDuff; import android.graphics.Rect; import android.os.Build; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.View; import android.view.ViewGroup; import android.view.ViewTreeObserver; import android.view.animation.AlphaAnimation; import android.widget.Filter; import android.widget.FrameLayout; import android.widget.RelativeLayout; import com.pchmn.materialchips.ChipsInput; import com.pchmn.materialchips.R; import com.pchmn.materialchips.adapter.FilterableAdapter; import com.pchmn.materialchips.model.ChipInterface; import com.pchmn.materialchips.util.ViewUtil; import java.util.List; public class FilterableListView extends RelativeLayout { private static final String TAG = FilterableListView.class.toString(); private FrameLayout frameLayout; private Context mContext; // list private RecyclerView mRecyclerView; private FilterableAdapter mAdapter; private List mFilterableList; // others private ChipsInput mChipsInput; private ViewGroup rootView; public FilterableListView(Context context) { this(context, null); } public FilterableListView(Context context, ViewGroup layout) { super(context); this.mContext = context; this.rootView = layout; init(); } private void init() { // inflate layout View view = inflate(getContext(), R.layout.list_filterable_view, this); mRecyclerView = (RecyclerView) view.findViewById(R.id.recycler_view); // recycler mRecyclerView.setLayoutManager(new LinearLayoutManager(mContext, LinearLayoutManager.VERTICAL, false)); // hide on first setVisibility(GONE); } public void build(List filterableList, ChipsInput chipsInput, ColorStateList backgroundColor, ColorStateList textColor) { mFilterableList = filterableList; mChipsInput = chipsInput; // adapter mAdapter = new FilterableAdapter(mContext, mRecyclerView, filterableList, chipsInput, backgroundColor, textColor); mRecyclerView.setAdapter(mAdapter); if(backgroundColor != null) mRecyclerView.getBackground().setColorFilter(backgroundColor.getDefaultColor(), PorterDuff.Mode.SRC_ATOP); // listen to change in the tree mChipsInput.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { // position if(rootView == null){ rootView = (ViewGroup) mChipsInput.getRootView(); } // size RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams( ViewUtil.getWindowWidth(mContext), ViewGroup.LayoutParams.WRAP_CONTENT); layoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP); layoutParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT); if (mContext.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) { layoutParams.bottomMargin = ViewUtil.getNavBarHeight(mContext); } //If this child view is already added to the parent rootView, then remove it first ViewGroup parent = (ViewGroup) FilterableListView.this.getParent(); if (parent != null) { parent.removeView(FilterableListView.this); } // add view rootView.addView(FilterableListView.this, layoutParams); // remove the listener: if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) { mChipsInput.getViewTreeObserver().removeGlobalOnLayoutListener(this); } else { mChipsInput.getViewTreeObserver().removeOnGlobalLayoutListener(this); } } }); } public void filterList(CharSequence text) { mAdapter.getFilter().filter(text, new Filter.FilterListener() { @Override public void onFilterComplete(int count) { // show if there are results if(mAdapter.getItemCount() > 0) fadeIn(); else fadeOut(); } }); } /** * Fade in */ public void fadeIn() { if(getVisibility() == VISIBLE) return; AlphaAnimation anim = new AlphaAnimation(0.0f, 1.0f); anim.setDuration(200); startAnimation(anim); setVisibility(VISIBLE); } /** * Fade out */ public void fadeOut() { if(getVisibility() == GONE) return; AlphaAnimation anim = new AlphaAnimation(1.0f, 0.0f); anim.setDuration(200); startAnimation(anim); setVisibility(GONE); } }