package net.tasksnow.view; import android.app.ListFragment; import android.os.Bundle; import android.text.Editable; import android.text.TextUtils; import android.text.TextWatcher; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.EditText; import android.widget.ImageButton; import android.widget.ListView; import net.tasksnow.R; import net.tasksnow.TaskNowApplication; import net.tasksnow.model.cards.CompleteItem; import net.tasksnow.model.cards.DismissItem; import net.tasksnow.view.reuse.GenericListAdapter; import net.tasksnow.view.slidingmenu.SlidingMenuActivity; import com.haarman.listviewanimations.itemmanipulation.OnDismissCallback; import com.haarman.listviewanimations.itemmanipulation.ReplaceRunnable; import com.haarman.listviewanimations.itemmanipulation.SwipeDismissAdapter; import com.haarman.listviewanimations.swinginadapters.prepared.SwingBottomInAnimationAdapter; import com.luma.android.andrologger.Logger; import java.util.ArrayList; /** * @author LuMa * @since 07:43:22 - 24.03.2013 * @project TasksNow */ public abstract class CardsListFragment extends ListFragment implements OnDismissCallback { //Is a ListFragment. Every instance of a ListFragment belongs exactly to one category in the sidemenu! private GenericListAdapter mCardsAdapter; private TaskNowApplication application; private EditText searchBox; private View headerView; private SwingBottomInAnimationAdapter swingBottomInAnimationAdapter; private String direction; private final ArrayList<GenericListAdapter.ListItem> remove = new ArrayList<GenericListAdapter.ListItem>(); ArrayList<GenericListAdapter.ListItem> temp = new ArrayList<GenericListAdapter.ListItem>(); private View dismissedView; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.cardlist_fragment, container, false); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); application = (TaskNowApplication) this.getActivity().getApplication(); if (this.mCardsAdapter == null) { this.mCardsAdapter = new GenericListAdapter(this.getActivity(), this.getDiffItemCount()); } Logger.onCreate(this.getActivity()); } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); this.getListView().setHeaderDividersEnabled(true); this.getListView().setVerticalScrollBarEnabled(false); this.getListView().setVerticalFadingEdgeEnabled(false); this.getListView().setClipToPadding(false); this.getListView().setOverScrollMode(View.OVER_SCROLL_NEVER); this.getListView().setOverscrollHeader(this.getResources().getDrawable(R.drawable.ic_action_new_labels)); this.getListView().setTextFilterEnabled(true); initHeaderView(); } @Override public void onPause() { super.onPause(); } @Override public void onDestroyView() { super.onDestroyView(); setListAdapter(null); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); if (headerView != null) this.getListView().addHeaderView(headerView); } public void updateListAdapter() { mCardsAdapter.clear(); this.fillListAdapter(mCardsAdapter); if (this.getListAdapter() == null && mCardsAdapter != null) { swingBottomInAnimationAdapter = new SwingBottomInAnimationAdapter(new SwipeDismissAdapter(mCardsAdapter, this)); swingBottomInAnimationAdapter.setListView(this.getListView()); this.setListAdapter(swingBottomInAnimationAdapter); } this.mCardsAdapter.notifyDataSetChanged(); } @Override public void onResume() { super.onResume(); Logger.onResume(this.getActivity()); this.updateListAdapter(); } @Override public void onDestroy() { super.onDestroy(); Logger.onDestroy(this.getActivity()); } @Override public void onDismiss(ListView listView, int[] reverseSortedPositions) { temp = new ArrayList<GenericListAdapter.ListItem>(); for (int i = 0; i < mCardsAdapter.getCount(); i++) { if (i == (reverseSortedPositions[0]) - 1) { //-1 because of header //direction determines if dismiss or completed card is created if (this.direction.equals("left")) { DismissItem dismiss = new DismissItem(this.dismissedView.getHeight()); temp.add(dismiss); //TODO just test card remove.add(dismiss); } else if (this.direction.equals("right")) { CompleteItem completeItem = new CompleteItem(this.dismissedView.getHeight()); remove.add(completeItem); temp.add(completeItem); //TODO just test card } } else { temp.add(mCardsAdapter.getItem(i)); } } mCardsAdapter.clear(); mCardsAdapter.addAll(temp); mCardsAdapter.notifyDataSetChanged(); } @Override public void setData(String direction, View dismissedView) { this.direction = direction; this.dismissedView = dismissedView; } @Override public void afterReplace() { // mCardsAdapter.remove(mCardsAdapter.getItem(removePosition.get(0))); mCardsAdapter.remove(remove.get(0)); remove.remove(0); mCardsAdapter.notifyDataSetChanged(); } @Override public void startTimer() { new ReplaceRunnable().execute(this); } @Override public void onStop() { if (searchBox != null) { searchBox.setText(null); } this.getListView().clearTextFilter(); super.onStop(); } public void initHeaderView() { LayoutInflater inflater = this.getActivity().getLayoutInflater(); headerView = inflater.inflate(R.layout.cardlist_header_view, this.getListView(), false); ImageButton headerIndicator = (ImageButton) headerView.findViewById(R.id.header_indicator); headerIndicator.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { ((SlidingMenuActivity) CardsListFragment.this.getActivity()).getSlidingMenu().toggle(); } }); searchBox = (EditText) headerView.findViewById(R.id.search_box); searchBox.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { if (TextUtils.isEmpty(s)) { CardsListFragment.this.getListView().clearTextFilter(); } else { CardsListFragment.this.getListView().setFilterText(s.toString()); } } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void afterTextChanged(Editable s) { } }); } public TaskNowApplication getApplication() { return application; } protected abstract int getDiffItemCount(); protected abstract void fillListAdapter(GenericListAdapter adapter); }