I'm actually using Groupie library, and I'm trying to delete a nested item inside a group adapter.
But when I use ItemTouchHelper, it only deletes the parent items(Objetos) or the nested items(Produtos), basically the first one that I try to swipe. It attaches just one of the ItemTouchHelpers to my RecyclerView.
Here is my Fragment Code:
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
metodos = new OSMetodos(requireContext(), requireActivity(), codOS);
adapter = new GroupAdapter<>();
adcTipoServ = view.findViewById(R.id.adcTipoServico);
adcTipoServ.setOnClickListener(view1 -> metodos.addService());
recyclerViewOS = view.findViewById(R.id.recyclerViewOSServ);
recyclerViewOS.setLayoutManager(new LinearLayoutManager(requireContext()));
setAdapter();
}
@Override
public void onResume() {
super.onResume();
setAdapter();
}
public void setAdapter() {
oldList.clear();
adapter.clear();
oldList = repo.getObjetoTipoServicoServicoCompleteWrappers(codOS, "D");
for (ObjetoTipoServicoServicoCompleteWrapper wrapper : oldList) {
servico = new OSServicoItem(wrapper, requireContext(), this);
objGroup = new ExpandableGroup(servico, false);
produtos = new ArrayList\<\>();
garantias = new ArrayList\<\>();
for (ProdutoServicoWithComodoProduto prod : wrapper.produtoServicoWithComodoProdutos) {
produtoItem = new OSServProdutoItem(prod, requireContext(), this);
produtoDetalhes = new OSServProdutoDetalhes(prod, requireContext(), requireActivity(), codOS);
prodGroup = new ExpandableGroup(produtoItem, false);
prodGroup.add(produtoDetalhes);
produtos.add(prodGroup);
}
for (GarantiaServicoClienteNewEntity garan : wrapper.garantiaServicoClienteNewEntities) {
garantiaItem = new OSServGarantiaItem(garan, requireContext());
garantias.add(garantiaItem);
}
prodSection = new Section(new OSServProdBtn(this), produtos);
garanSection = new Section(new OSServGaranBtn(this), garantias);
objGroup.add(prodSection);
objGroup.add(garanSection);
adapter.add(objGroup);
}
recyclerViewOS.setAdapter(adapter);
}
@Override
public void onSwiped(@Nullable ObjetoTipoServicoServicoCompleteWrapper objeto, @Nullable ProdutoServicoWithComodoProduto wrapper, int op) {
if (op == 0) {
SwipeToDelete swipeToDelete = new SwipeToDelete(0, ItemTouchHelper.LEFT, requireContext(), adapter, wrapper, null, oldList, requireActivity(), repo, op);
ItemTouchHelper itemTouchhelper = new ItemTouchHelper(swipeToDelete);
itemTouchhelper.attachToRecyclerView(recyclerViewOS);
} else {
SwipeToDelete swipeToDelete = new SwipeToDelete(0, ItemTouchHelper.LEFT, requireContext(), adapter, null, objeto, oldList, requireActivity(), repo, op);
ItemTouchHelper itemTouchhelper = new ItemTouchHelper(swipeToDelete);
itemTouchhelper.attachToRecyclerView(recyclerViewOS);
}
}
Here's my ParentItem GestureHelper:
public class GestureHelper implements View.OnTouchListener {
private final GestureDetector mGestureDetector;
private ObjetoTipoServicoServicoCompleteWrapper objeto;
public GestureHelper(Context context, ObjetoTipoServicoServicoCompleteWrapper objeto) {
mGestureDetector = new GestureDetector(context, new GestureListener(this));
this.objeto = objeto;
}
public void onSwipeRight() {
}
public void onSwipeLeft() {
onSwipe.onSwiped(objeto, null, 1);
}
public void onSwipeTop() {
}
public void onSwipeBottom() {
}
public void onDoubleTap() {
}
public void onClick() {
expandableGroup.onToggleExpanded();
}
@Override
public boolean onTouch(View v, MotionEvent event) {
return mGestureDetector.onTouchEvent(event);
}
private final class GestureListener extends GestureDetector.SimpleOnGestureListener {
private static final int SWIPE_THRESHOLD = 100;
private static final int SWIPE_VELOCITY_THRESHOLD = 100;
private GestureHelper mHelper;
public GestureListener(GestureHelper helper) {
mHelper = helper;
}
@Override
public boolean onDown(MotionEvent e) {
return true;
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
mHelper.onClick();
return true;
}
@Override
public boolean onDoubleTap(MotionEvent e) {
mHelper.onDoubleTap();
return true;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
boolean result = false;
try {
float diffY = e2.getY() - e1.getY();
float diffX = e2.getX() - e1.getX();
if (Math.abs(diffX) > Math.abs(diffY)) {
if (Math.abs(diffX) > SWIPE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {
if (diffX > 0) {
mHelper.onSwipeRight();
} else {
mHelper.onSwipeLeft();
}
}
} else {
if (Math.abs(diffY) > SWIPE_THRESHOLD && Math.abs(velocityY) > SWIPE_VELOCITY_THRESHOLD) {
if (diffY > 0) {
mHelper.onSwipeBottom();
} else {
mHelper.onSwipeTop();
}
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
return result;
}
}
}
And finally my NestedItem GestureHelper:
public class GestureHelper implements View.OnTouchListener {
private final GestureDetector mGestureDetector;
private ProdutoServicoWithComodoProduto wrapper;
public GestureHelper(ProdutoServicoWithComodoProduto wrapper) {
mGestureDetector = new GestureDetector(context, new GestureListener(this));
this.wrapper = wrapper;
}
public void onSwipeRight() {
}
public void onSwipeLeft() {
onSwipeProduto.onSwiped(null, wrapper, 0);
}
public void onSwipeTop() {
}
public void onSwipeBottom() {
}
public void onDoubleTap() {
}
public void onClick() {
expandableGroup.onToggleExpanded();
}
@Override
public boolean onTouch(View v, MotionEvent event) {
return mGestureDetector.onTouchEvent(event);
}
private final class GestureListener extends GestureDetector.SimpleOnGestureListener {
private static final int SWIPE_THRESHOLD = 100;
private static final int SWIPE_VELOCITY_THRESHOLD = 100;
private GestureHelper mHelper;
public GestureListener(GestureHelper helper) {
mHelper = helper;
}
@Override
public boolean onDown(MotionEvent e) {
return true;
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
mHelper.onClick();
return true;
}
@Override
public boolean onDoubleTap(MotionEvent e) {
mHelper.onDoubleTap();
return true;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
boolean result = false;
try {
float diffY = e2.getY() - e1.getY();
float diffX = e2.getX() - e1.getX();
if (Math.abs(diffX) > Math.abs(diffY)) {
if (Math.abs(diffX) > SWIPE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {
if (diffX > 0) {
mHelper.onSwipeRight();
} else {
mHelper.onSwipeLeft();
}
}
} else {
if (Math.abs(diffY) > SWIPE_THRESHOLD && Math.abs(velocityY) > SWIPE_VELOCITY_THRESHOLD) {
if (diffY > 0) {
mHelper.onSwipeBottom();
} else {
mHelper.onSwipeTop();
}
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
return result;
}
}
}