package com.kemallette.ListBoost.List; import android.content.Context; import android.os.Parcelable; import android.util.AttributeSet; import android.view.View; import android.widget.AdapterView; import android.widget.BaseAdapter; import android.widget.ListView; import com.kemallette.ListBoost.R; import com.kemallette.ListBoost.List.BaseBoostAdapter.ViewHolder; public class BoostListView extends ListView{ private static final String TAG = "BoostListView"; class Holder{ View mSlideMenuToggle; Holder(){ } } private boolean isSlidingEnabled = false; private int slideToggleId; private BoostAdapter mAdapter; public BoostListView(Context context){ super(context); } public BoostListView(Context context, AttributeSet attrs){ super(context, attrs); } public BoostListView(Context context, AttributeSet attrs, int defStyle){ super(context, attrs, defStyle); } public void setAdapter(BoostAdapter adapter){ this.mAdapter = adapter; super.setAdapter(adapter); } public void setAdapter(BaseAdapter adapter){ setAdapter(new BoostAdapter(adapter)); } public void enableSlidingMenus(OnSlidingMenuItemClickListener mSlidingMenuClickListener, int slideToggleId, int slidingLayoutId, int... slidingViewButtonIds){ isSlidingEnabled = true; mAdapter.enableSlidingMenu(mSlidingMenuClickListener, slideToggleId, slidingLayoutId, slidingViewButtonIds); this.slideToggleId = slideToggleId; refreshVisibleItems(); } public void enableSlidingMenu(OnSlidingMenuItemClickListener mSlidingMenuClickListener, int... slidingViewButtonIds){ enableSlidingMenus(mSlidingMenuClickListener, R.id.slide_toggle_button, R.id.sliding_view_id, slidingViewButtonIds); } public void disableSlidingMenus(){ isSlidingEnabled = false; mAdapter.disableSlidingMenu(); refreshVisibleItems(); } /* * Applies the user supplied color values to the visible list items. This * does not touch the recycled off screen views. */ private void refreshVisibleItems(){ View listItem; ViewHolder mHolder; // These are both implemented in AdapterView which means // they're flat list positions int firstVis = getFirstVisiblePosition(); int lastVis = getLastVisiblePosition(); /* This is the "conversion" from flat list positions to ViewGroup child positions */ int count = lastVis - firstVis; while (count >= 0){ // looping through visible list items /* * getChildAt(pos) is implemented in ViewGroup and has a different meaning for * its position values. ViewGroup tracks visible items as children and is 0 indexed. * This means you'll have 0 - X positions where X is however many items it takes * to fill the visible area of your screen; usually less than 10. */ listItem = getChildAt(count); if (listItem != null){ mHolder = (ViewHolder) listItem.getTag(); if (mHolder == null){ // This shouldn't happen, but we'll make // sure in case some strange concurrency // bugs appear mHolder = ViewHolder.getInstance(); mHolder.mSlideOpenToggle = (View) listItem.findViewById(slideToggleId); listItem.setTag(mHolder); } if (isSlidingEnabled){ mHolder.mSlideOpenToggle.setVisibility(View.VISIBLE); }else mHolder.mSlideOpenToggle.setVisibility(View.INVISIBLE); mAdapter.setupSlidingMenu(listItem, firstVis + count); } count--; } } /** * Collapses the currently open view. * * @return true if a view was collapsed, false if there was no open view. */ public boolean collapse(){ if (mAdapter != null) return mAdapter.collapseLastOpen(); return false; } /** * Registers a OnItemClickListener for this listview which overrides any already registered. * When an item is clicked, it slides the menu open. * * You can disable this at any time by setting your own onItemClickListener to your list. * */ public void enableOpenOnItemClick(){ this.setOnItemClickListener(new OnItemClickListener(){ @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l){ BoostAdapter adapter = (BoostAdapter) getAdapter(); adapter.getExpandToggleButton(view) .performClick(); } }); } @Override public Parcelable onSaveInstanceState(){ if (mAdapter != null) return mAdapter.onSaveInstanceState(super.onSaveInstanceState()); else return super.onSaveInstanceState(); } @Override public void onRestoreInstanceState(Parcelable state){ if (!(state instanceof BaseBoostAdapter.SavedState)){ super.onRestoreInstanceState(state); return; } BaseBoostAdapter.SavedState ss = (BaseBoostAdapter.SavedState) state; super.onRestoreInstanceState(ss.getSuperState()); if (mAdapter != null) mAdapter.onRestoreInstanceState(ss); } }