157 lines
5.1 KiB
Java
157 lines
5.1 KiB
Java
/*
|
|
* Copyright 2015 Christian Basler
|
|
*
|
|
* 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
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* 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 ch.dissem.apps.abit;
|
|
|
|
import android.content.Context;
|
|
import android.os.Bundle;
|
|
import android.support.v4.app.ListFragment;
|
|
import android.view.View;
|
|
import android.widget.ListView;
|
|
|
|
import ch.dissem.apps.abit.listener.ListSelectionListener;
|
|
|
|
/**
|
|
* @author Christian Basler
|
|
*/
|
|
public abstract class AbstractItemListFragment<L, T> extends ListFragment implements ListHolder<L> {
|
|
/**
|
|
* The serialization (saved instance state) Bundle key representing the
|
|
* activated item position. Only used on tablets.
|
|
*/
|
|
private static final String STATE_ACTIVATED_POSITION = "activated_position";
|
|
/**
|
|
* A dummy implementation of the {@link ListSelectionListener} interface that does
|
|
* nothing. Used only when this fragment is not attached to an activity.
|
|
*/
|
|
private static final ListSelectionListener<Object> dummyCallbacks =
|
|
new ListSelectionListener<Object>() {
|
|
@Override
|
|
public void onItemSelected(Object item) {
|
|
// NO OP
|
|
}
|
|
};
|
|
/**
|
|
* The fragment's current callback object, which is notified of list item
|
|
* clicks.
|
|
*/
|
|
private ListSelectionListener<? super T> callbacks = dummyCallbacks;
|
|
/**
|
|
* The current activated item position. Only used on tablets.
|
|
*/
|
|
private int activatedPosition = ListView.INVALID_POSITION;
|
|
private boolean activateOnItemClick;
|
|
|
|
@Override
|
|
public void onViewCreated(View view, Bundle savedInstanceState) {
|
|
super.onViewCreated(view, savedInstanceState);
|
|
|
|
// Restore the previously serialized activated item position.
|
|
if (savedInstanceState != null
|
|
&& savedInstanceState.containsKey(STATE_ACTIVATED_POSITION)) {
|
|
setActivatedPosition(savedInstanceState.getInt(STATE_ACTIVATED_POSITION));
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onResume() {
|
|
super.onResume();
|
|
|
|
// When setting CHOICE_MODE_SINGLE, ListView will automatically
|
|
// give items the 'activated' state when touched.
|
|
getListView().setChoiceMode(activateOnItemClick
|
|
? ListView.CHOICE_MODE_SINGLE
|
|
: ListView.CHOICE_MODE_NONE);
|
|
}
|
|
|
|
@Override
|
|
public void onAttach(Context context) {
|
|
super.onAttach(context);
|
|
|
|
// Activities containing this fragment must implement its callbacks.
|
|
if (context instanceof ListSelectionListener) {
|
|
//noinspection unchecked
|
|
callbacks = (ListSelectionListener) context;
|
|
} else {
|
|
throw new IllegalStateException("Activity must implement fragment's callbacks.");
|
|
}
|
|
|
|
}
|
|
|
|
@Override
|
|
public void onDetach() {
|
|
super.onDetach();
|
|
|
|
// Reset the active callbacks interface to the dummy implementation.
|
|
callbacks = dummyCallbacks;
|
|
}
|
|
|
|
@Override
|
|
public void onListItemClick(ListView listView, View view, int position, long id) {
|
|
super.onListItemClick(listView, view, position, id);
|
|
|
|
// Notify the active callbacks interface (the activity, if the
|
|
// fragment is attached to one) that an item has been selected.
|
|
//noinspection unchecked
|
|
callbacks.onItemSelected((T) listView.getItemAtPosition(position));
|
|
}
|
|
|
|
@Override
|
|
public void onSaveInstanceState(Bundle outState) {
|
|
super.onSaveInstanceState(outState);
|
|
if (activatedPosition != ListView.INVALID_POSITION) {
|
|
// Serialize and persist the activated item position.
|
|
outState.putInt(STATE_ACTIVATED_POSITION, activatedPosition);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Turns on activate-on-click mode. When this mode is on, list items will be
|
|
* given the 'activated' state when touched.
|
|
*/
|
|
public void setActivateOnItemClick(boolean activateOnItemClick) {
|
|
this.activateOnItemClick = activateOnItemClick;
|
|
|
|
if (isVisible()) {
|
|
// When setting CHOICE_MODE_SINGLE, ListView will automatically
|
|
// give items the 'activated' state when touched.
|
|
getListView().setChoiceMode(activateOnItemClick
|
|
? ListView.CHOICE_MODE_SINGLE
|
|
: ListView.CHOICE_MODE_NONE);
|
|
}
|
|
}
|
|
|
|
private void setActivatedPosition(int position) {
|
|
if (position == ListView.INVALID_POSITION) {
|
|
getListView().setItemChecked(activatedPosition, false);
|
|
} else {
|
|
getListView().setItemChecked(position, true);
|
|
}
|
|
|
|
activatedPosition = position;
|
|
}
|
|
|
|
@Override
|
|
public L getCurrentLabel() {
|
|
return null;
|
|
}
|
|
|
|
@Override
|
|
public boolean showPreviousList() {
|
|
return false;
|
|
}
|
|
}
|