package com.beloo.chipslayoutmanager.sample.ui; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.annotation.RestrictTo; import android.support.v4.app.Fragment; import android.support.v7.widget.RecyclerView; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.Spinner; import com.beloo.widget.chipslayoutmanager.ChipsLayoutManager; import com.beloo.widget.chipslayoutmanager.SpacingItemDecoration; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import com.beloo.chipslayoutmanager.sample.R; import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnClick; /** */ public class ItemsFragment extends Fragment { private static final String EXTRA = "data"; @BindView(R.id.rvTest) RecyclerView rvTest; @BindView(R.id.spinnerPosition) Spinner spinnerPosition; @BindView(R.id.spinnerMoveTo) Spinner spinnerMoveTo; private RecyclerView.Adapter adapter; private List<String> positions; private List items; /** replace here different data sets */ private IItemsFactory itemsFactory = new ShortChipsFactory(); @RestrictTo(RestrictTo.Scope.SUBCLASSES) public ItemsFragment() { // Required empty public constructor } public static ItemsFragment newInstance() { return new ItemsFragment(); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment return inflater.inflate(R.layout.fragment_items, container, false); } @SuppressWarnings("unchecked") private RecyclerView.Adapter createAdapter(Bundle savedInstanceState) { List<String> items; if (savedInstanceState == null) { // items = itemsFactory.getFewItems(); // items = itemsFactory.getALotOfItems(); items = itemsFactory.getItems(); } else { items = savedInstanceState.getStringArrayList(EXTRA); } adapter = itemsFactory.createAdapter(items, onRemoveListener); this.items = items; return adapter; } @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); ButterKnife.bind(this, view); adapter = createAdapter(savedInstanceState); ChipsLayoutManager spanLayoutManager = ChipsLayoutManager.newBuilder(getContext()) .setOrientation(ChipsLayoutManager.HORIZONTAL) .build(); 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<>(getContext(), android.R.layout.simple_list_item_1, android.R.id.text1, positions); ArrayAdapter<String> spinnerAdapterMoveTo = new ArrayAdapter<>(getContext(), android.R.layout.simple_list_item_1, android.R.id.text1, positions); spinnerPosition.setAdapter(spinnerAdapter); spinnerMoveTo.setAdapter(spinnerAdapterMoveTo); rvTest.setLayoutManager(spanLayoutManager); rvTest.getRecycledViewPool().setMaxRecycledViews(0, 10); rvTest.getRecycledViewPool().setMaxRecycledViews(1, 10); rvTest.setAdapter(adapter); } private OnRemoveListener onRemoveListener = new OnRemoveListener() { @Override public void onItemRemoved(int position) { items.remove(position); Log.i("activity", "delete at " + position); adapter.notifyItemRemoved(position); updateSpinners(); } }; @Override @SuppressWarnings("unchecked") public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); 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<>(getContext(), 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<>(getContext(), android.R.layout.simple_list_item_1, android.R.id.text1, positions); spinnerMoveTo.setAdapter(spinnerAdapterMoveTo); spinnerMoveTo.setSelection(selectedMoveToPosition); } @OnClick(R.id.btnRevert) 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); } @OnClick(R.id.btnDelete) 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(); } @OnClick(R.id.btnMove) 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); } @OnClick(R.id.btnScroll) public void onScrollClicked(View view) { // rvTest.scrollBy(0, 500); rvTest.scrollToPosition(spinnerPosition.getSelectedItemPosition()); } @OnClick(R.id.btnInsert) 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(); } }