Android Open Source - ShareList-Android List Fragment






From Project

Back to project page ShareList-Android.

License

The source code is released under:

GNU General Public License

If you think the Android project ShareList-Android listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

package org.mybop.sharelist.app.view.support;
// w  ww .j  a  v a2  s.c o m
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.view.ActionMode;
import android.util.SparseBooleanArray;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.Checkable;
import android.widget.ListAdapter;
import android.widget.ListView;

import org.mybop.sharelist.app.R;
import org.mybop.sharelist.app.util.ArrayUtil;

public abstract class ListFragment extends Fragment {

    public interface OnItemDeletionListener {
        void onItemDeletion(Object[] selectedItems);
    }

    public interface OnItemSelectionListener {
        public void onItemSelection(Object selectedItem);
    }

    private ListView listView;

    private View emptyList;

    private ListAdapter adapter;

    private OnItemDeletionListener deletionListener;

    private OnItemSelectionListener selectionListener;

    private ActionMode actionMode = null;

    protected boolean selected = false;

    protected long[] selectedIds = new long[0];

    private boolean viewInitialized = false;

    private boolean dataInitialized = false;

    private ActionMode.Callback actionModeCallback = new ActionMode.Callback() {

        @Override
        public boolean onCreateActionMode(ActionMode actionMode, Menu menu) {
            MenuInflater inflater = actionMode.getMenuInflater();
            inflater.inflate(R.menu.rowselection, menu);
            return true;
        }

        @Override
        public boolean onPrepareActionMode(ActionMode actionMode, Menu menu) {
            return false;
        }

        @Override
        public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) {
            if (R.id.action_delete_selection == menuItem.getItemId()) {
                if (deletionListener != null) {
                    Object[] selectedItems = new Object[selectedIds.length];
                    for (int i = 0, j = 0; i < listView.getAdapter().getCount(); i++) {
                        if (ArrayUtil.contains(selectedIds, listView.getAdapter().getItemId(i))) {
                            selectedItems[j] = listView.getAdapter().getItem(i);
                            j++;
                        }
                    }
                    deletionListener.onItemDeletion(selectedItems);
                }
                actionMode.finish();
                return true;
            }
            return false;
        }

        // called when the user exits the action mode
        @Override
        public void onDestroyActionMode(ActionMode actionMode) {
            selected = false;

            ListFragment.this.actionMode = null;

            SparseBooleanArray positions = listView.getCheckedItemPositions();
            assert positions != null;
            int itemCount = listView.getCount();
            for (int i = 0; i < itemCount; i++) {
                if (positions.get(i)) {
                    listView.setItemChecked(i, false);
                }
            }
            int childCount = listView.getChildCount();
            for (int i = 0; i < childCount; i++) {
                View child = listView.getChildAt(i);
                if (child instanceof Checkable) {
                    ((Checkable) child).setChecked(false);
                }
            }
            listView.setChoiceMode(AbsListView.CHOICE_MODE_NONE);
        }
    };

    @Override
    public void onSaveInstanceState(Bundle outState) {
        outState.putBoolean("selected", selected);
        outState.putLongArray("selectedIds", selectedIds);
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        listView = (ListView) getView().findViewById(R.id.listView);
        assert listView != null;
        emptyList = getView().findViewById(R.id.listEmpty);
        assert emptyList != null;
        listView.setEmptyView(emptyList);
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                if (actionMode != null) {
                    selectedIds = listView.getCheckedItemIds();
                    int selectedCount = selectedIds.length;
                    if (selectedCount > 0) {
                        actionMode.setTitle(Integer.toString(selectedCount));
                    } else {
                        actionMode.finish();
                    }
                } else {
                    if (selectionListener != null) {
                        selectionListener.onItemSelection(adapter.getItem(position));
                    }
                }
            }
        });
        listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
                if (actionMode != null) {
                    return false;
                }
                listView.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE);
                listView.setItemChecked(position, true);
                actionMode = ((ActionBarActivity) getActivity()).startSupportActionMode(actionModeCallback);
                actionMode.setTitle("1");

                selected = true;
                selectedIds = listView.getCheckedItemIds();
                return true;
            }
        });

        if (savedInstanceState != null) {
            selected = savedInstanceState.getBoolean("selected");
            selectedIds = savedInstanceState.getLongArray("selectedIds");
        }

        viewInitialized = true;

        restoreState();
    }

    private void restoreState() {
        if (!viewInitialized || !dataInitialized)
            return;

        listView.setAdapter(adapter);

        if (selected) {
            listView.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE);
            for (int i = 0; i < adapter.getCount(); i++) {
                if (ArrayUtil.contains(selectedIds, adapter.getItemId(i))) {
                    listView.setItemChecked(i, true);
                }
            }
            actionMode = ((ActionBarActivity) getActivity()).startSupportActionMode(actionModeCallback);
            actionMode.setTitle(Integer.toString(selectedIds.length));
        }
    }


    public void setAdapter(ListAdapter adapter) {
        if (!adapter.hasStableIds()) {
            throw new IllegalStateException("the adapter must have stable ids to support deletion");
        }
        this.adapter = adapter;

        dataInitialized = true;

        restoreState();
    }

    public void setOnItemDeletionListener(OnItemDeletionListener deletionListener) {
        this.deletionListener = deletionListener;
    }

    public void setOnItemSelectionListener(OnItemSelectionListener selectionListener) {
        this.selectionListener = selectionListener;
    }

    public ListView getListView() {
        return listView;
    }

    public View getEmptyList() {
        return emptyList;
    }

    public ListAdapter getAdapter() {
        return adapter;
    }
}




Java Source Code List

org.mybop.sharelist.app.ShareListApplication.java
org.mybop.sharelist.app.control.DetailActivity.java
org.mybop.sharelist.app.control.DetailController.java
org.mybop.sharelist.app.control.ListController.java
org.mybop.sharelist.app.control.MainActivity.java
org.mybop.sharelist.app.database.DatabaseHelper.java
org.mybop.sharelist.app.database.NoIdCursorWrapper.java
org.mybop.sharelist.app.database.entity.ElementEntity.java
org.mybop.sharelist.app.database.entity.ListEntity.java
org.mybop.sharelist.app.database.repository.ElementRepository.java
org.mybop.sharelist.app.database.repository.ListRepository.java
org.mybop.sharelist.app.util.ArrayUtil.java
org.mybop.sharelist.app.view.DetailAdapter.java
org.mybop.sharelist.app.view.DetailFragment.java
org.mybop.sharelist.app.view.ListAdapter.java
org.mybop.sharelist.app.view.MasterFragment.java
org.mybop.sharelist.app.view.support.CheckableLinearLayout.java
org.mybop.sharelist.app.view.support.CheckableRelativeLayout.java
org.mybop.sharelist.app.view.support.ListFragment.java
org.mybop.sharelist.app.view.support.OrmLiteAdapter.java