package com.beloo.chipslayoutmanager.sample.ui;
import android.support.annotation.UiThread;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import com.beloo.widget.chipslayoutmanager.SpacingItemDecoration;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import com.beloo.chipslayoutmanager.sample.R;
public class TestActivity extends AppCompatActivity {
private static final String EXTRA = "data";
private RecyclerView rvTest;
private RecyclerView.Adapter adapter;
private Spinner spinnerPosition;
private Spinner spinnerMoveTo;
private List<String> positions;
private List items;
/** replace here different data sets */
static IItemsFacade itemsFactory = new FewChipsFacade();
static LayoutManagerFactory lmFactory = new LayoutManagerFactory();
public static boolean isInitializeOutside;
private OnRemoveListener onRemoveListener = new OnRemoveListener() {
@Override
public void onItemRemoved(int position) {
items.remove(position);
Log.i("activity", "delete at " + position);
adapter.notifyItemRemoved(position);
updateSpinners();
}
};
public static void setLmFactory(LayoutManagerFactory lmFactory) {
TestActivity.lmFactory = lmFactory;
}
public static void setItemsFactory(IItemsFacade itemsFactory) {
TestActivity.itemsFactory = itemsFactory;
}
@SuppressWarnings("unchecked")
private RecyclerView.Adapter createAdapter() {
if (items == null) {
items = itemsFactory.getItems();
}
adapter = itemsFactory.createAdapter(items, onRemoveListener);
return adapter;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
items = savedInstanceState.getParcelableArrayList(EXTRA);
}
setContentView(R.layout.activity_test);
rvTest = (RecyclerView) findViewById(R.id.rvTest);
spinnerPosition = (Spinner) findViewById(R.id.spinnerPosition);
spinnerMoveTo = (Spinner) findViewById(R.id.spinnerMoveTo);
if (!isInitializeOutside || savedInstanceState != null) {
initialize();
}
}
@UiThread
public void initialize() {
initRv();
}
@UiThread
private void initRv() {
adapter = createAdapter();
RecyclerView.LayoutManager layoutManager = lmFactory.layoutManager(this);
if (layoutManager == null) Log.e("initRv", "lm manager is null");
rvTest.addItemDecoration(new SpacingItemDecoration(getResources().getDimensionPixelOffset(R.dimen.item_space),
getResources().getDimensionPixelOffset(R.dimen.item_space)));
positions = new LinkedList<>();
for (int i = 0; i< items.size(); i++) {
positions.add(String.valueOf(i));
}
ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, android.R.id.text1, positions);
ArrayAdapter<String> spinnerAdapterMoveTo = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, android.R.id.text1, positions);
spinnerPosition.setAdapter(spinnerAdapter);
spinnerMoveTo.setAdapter(spinnerAdapterMoveTo);
rvTest.setLayoutManager(layoutManager);
// rvTest.setLayoutManager(new LinearLayoutManager(this));
rvTest.getRecycledViewPool().setMaxRecycledViews(0, 10);
rvTest.getRecycledViewPool().setMaxRecycledViews(1, 10);
rvTest.setAdapter(adapter);
}
@Override
@SuppressWarnings("unchecked")
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
if (items == null) {
Log.e("onSaveInstanceState", "possible problem due to rotation test runned before");
} else {
outState.putParcelableArrayList(EXTRA, new ArrayList<>(items));
}
}
private void updateSpinners() {
positions = new LinkedList<>();
for (int i = 0; i< items.size(); i++) {
positions.add(String.valueOf(i));
}
int selectedPosition = Math.min(spinnerPosition.getSelectedItemPosition(), positions.size() - 1);
int selectedMoveToPosition = Math.min(spinnerMoveTo.getSelectedItemPosition(), positions.size() -1);
ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, android.R.id.text1, positions);
spinnerPosition.setAdapter(spinnerAdapter);
selectedPosition = Math.min(spinnerAdapter.getCount() -1 , selectedPosition);
spinnerPosition.setSelection(selectedPosition);
ArrayAdapter<String> spinnerAdapterMoveTo = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, android.R.id.text1, positions);
spinnerMoveTo.setAdapter(spinnerAdapterMoveTo);
spinnerMoveTo.setSelection(selectedMoveToPosition);
}
public void onRevertClicked(View view) {
int position = spinnerPosition.getSelectedItemPosition();
if (position == Spinner.INVALID_POSITION)
return;
int positionMoveTo = spinnerMoveTo.getSelectedItemPosition();
if (positionMoveTo == Spinner.INVALID_POSITION)
return;
if (position == positionMoveTo) return;
spinnerPosition.setSelection(positionMoveTo);
spinnerMoveTo.setSelection(position);
}
public void onDeleteClicked(View view) {
int position = spinnerPosition.getSelectedItemPosition();
if (position == Spinner.INVALID_POSITION)
return;
items.remove(position);
Log.i("activity", "delete at " + position);
adapter.notifyItemRemoved(position);
updateSpinners();
}
public void onMoveClicked(View view) {
int position = spinnerPosition.getSelectedItemPosition();
if (position == Spinner.INVALID_POSITION)
return;
int positionMoveTo = spinnerMoveTo.getSelectedItemPosition();
if (positionMoveTo == Spinner.INVALID_POSITION)
return;
if (position == positionMoveTo) return;
Object item = items.remove(position);
items.add(positionMoveTo, item);
adapter.notifyItemMoved(position, positionMoveTo);
}
public void onScrollClicked(View view) {
rvTest.scrollToPosition(spinnerPosition.getSelectedItemPosition());
}
public void onInsertClicked(View view) {
int position = spinnerPosition.getSelectedItemPosition();
if (position == Spinner.INVALID_POSITION)
position = 0;
items.add(position, itemsFactory.createOneItemForPosition(position));
Log.i("activity", "insert at " + position);
adapter.notifyItemInserted(position);
updateSpinners();
}
}