RecyclerView reuse View

-1

I am Implementing a RecyclerView as follows:

class ObjAdapter extends RecyclerView.Adapter<ObjetoHolder>{

        private RealmResults<Objeto> objetos;

        private final SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yy HH:mm:ss");
        final RealmChangeListener change = new RealmChangeListener<RealmResults<Objeto>>() {
            @Override
            public void onChange(RealmResults<Objeto> element) {
                objetos = element;
                ObjAdapter.this.notifyDataSetChanged();
            }
        };

        public ObjAdapter(){
            objetos = realm.where(Objeto.class).findAll().sort("id");
            objetos.addChangeListener(change);
        }

        @Override
        public ObjetoHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            return new ObjetoHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.adapter, parent, false));
        }

        @Override
        public void onBindViewHolder(ObjetoHolder holder, int position) {
            final Objeto objeto = objetos.get(position);
            holder.objName.setText(objeto.getName());
            holder.objTimestamp.setText(sdf.format(objeto.getTimestamp()));
            holder.objId.setText(objeto.getId().toString());
        }

        @Override
        public int getItemCount() {
            return objetos.size();
        }
    }

    public static final class ObjetoHolder extends RecyclerView.ViewHolder {
        ObjCard cv;
        TextView objId;
        TextView objName;
        TextView objTimestamp;

        ObjetoHolder(final View view){
            super(view);
            cv = ObjCard.class.cast(view.findViewById(R.id.cv));
            objId = TextView.class.cast(view.findViewById(R.id.objId));
            objName = TextView.class.cast(view.findViewById(R.id.objName));
            objTimestamp = TextView.class.cast(view.findViewById(R.id.objTimestamp));
        }


    }

One of the elements is ObjCard , an object that I created, which extends from CardView . I do this because I implement a GestureListener .

public class ObjCard extends CardView   {


    public ObjCard(Context context) {
        super(context);
        initalize();
    }
    public ObjCard(Context context, AttributeSet attrs) {
        super(context, attrs);
        initalize();
    }
    public ObjCard(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initalize();
    }
    private void initalize(){
        setOnTouchListener(new OnSwipeTouchListener(getContext()));
    }

    public class OnSwipeTouchListener implements OnTouchListener {

        private final GestureDetector gestureDetector;

        public OnSwipeTouchListener (Context ctx){
            gestureDetector = new GestureDetector(ctx, new GestureListener());
        }
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            return gestureDetector.onTouchEvent(event);
        }

        private final class GestureListener extends GestureDetector.SimpleOnGestureListener {

            private static final int SWIPE_THRESHOLD = 100;
            private static final int SWIPE_VELOCITY_THRESHOLD = 100;

            @Override
            public boolean onDown(MotionEvent e) {
                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) {
                                onSwipeRight();
                            } else {
                                onSwipeLeft();
                            }
                        }
                        result = true;
                    }
                    else if (Math.abs(diffY) > SWIPE_THRESHOLD && Math.abs(velocityY) > SWIPE_VELOCITY_THRESHOLD) {
                        if (diffY > 0) {
                            onSwipeBottom();
                        } else {
                            onSwipeTop();
                        }
                    }
                    result = true;

                } catch (Exception exception) {
                    exception.printStackTrace();
                }
                return result;
            }
        }

        public void onSwipeRight() {
            Log.w("[SWIPE]", "RIGHT >");
            final ImageButton deleteAction = ImageButton.class.cast(findViewById(R.id.deleteAction));
            if(deleteAction.getVisibility() == View.VISIBLE){
                final Animation _anim = AnimationUtils.loadAnimation(getContext(), R.anim.slide_out_to_right);
                deleteAction.startAnimation(_anim);
                deleteAction.setVisibility(View.GONE);
            }


        }

        public void onSwipeLeft() {
            Log.w("[SWIPE]", "< LEFT ");
            final ImageButton deleteAction = ImageButton.class.cast(findViewById(R.id.deleteAction));
            if(deleteAction.getVisibility() == View.GONE){
                final Animation _anim = AnimationUtils.loadAnimation(getContext(),  R.anim.slide_in_to_right);
                deleteAction.startAnimation(_anim);
                deleteAction.setVisibility(View.VISIBLE);

            }


        }

    }

}

Whenever I swipe right, a Button is displayed to delete the item.

My problem is that when the button is displayed in a Card , when scrolling, Card is recreated, and the button is displayed in another item.

Is there any way to control this?

How can I fix that only the one that made the swipe will be displayed?

    
asked by anonymous 13.07.2016 / 18:11

1 answer

1

Speak Thiago,

I suffered a lot from this when I started working with RecyclerView.

As the name says, it reuses the cells that have already been created.

You probably do an if to pop the button, right?

if(swipe){
   //aparece o botão
}

Whenever you work with IF in RecyclerView, you MUST think about ELSE, then:

if(swipe){
    //aparece o botão
}else{
    //desaparece o botão
}

This will solve your problem.

Hugs.

    
13.07.2016 / 18:38