0

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;
        }
    }

}
lisa p.
  • 2,138
  • 21
  • 36

0 Answers0