Адаптер simpleCursor и анимация - анимация удаляет более 1 элемента - PullRequest
0 голосов
/ 19 января 2020

Я реализовал простой адаптер курсора в виде списка. Тогда я проведу пальцем вправо или влево. При смахивании я получаю новый курсор и обновляю список. Все отлично работает здесь, элементы удаляются, и я правильно получаю новый курсор. Однако у меня проблемы с анимацией. Когда я добавляю анимацию и смахиваю на право (левый еще не реализован), удаляется более 1 элемента. Например, если у меня есть 4 предмета и я уберу четвертый, тогда пункты 1 и 3 останутся, 2 и 4 потерялись бы, как я заметил, или что-то похожее. 2 на время выдвигаются, когда я выдвигаюсь на 1 предмет.

Вот мой код:

listView.setOnTouchListener(new OnSwipeTouchListener(getApplicationContext()) {

        @Override
        public void onSwipeRight(int pos) {

            singleView = getViewByPosition(pos, listView);

            dbManager.open();
            int i = cursor.getColumnIndex("position");
            int po = cursor.getInt(i);
            mainposition = Integer.toString(po);

            dbManager.updatePosition(mainposition,"3");

            new AsyncTask().execute();


            //this method is a problem!!!
            //slideOutRight(singleView);


        }
        public void onSwipeLeft(int pos) {
            Toast.makeText(MainWorkplace.this, "left", Toast.LENGTH_SHORT).show();
        }


    });

Вот моя задача Asyn c для обработки БД:

 class AsyncTask extends android.os.AsyncTask<String, Integer, String>{


        @Override
        protected String doInBackground(String... strings) {

            cursor = dbManager.getOpenNotifications();

            return null;
        }

        @Override
        protected void onPostExecute(String jsonResponse) {
            super.onPostExecute(jsonResponse);
            dbManager.open();
            try {
                simpleCursorAdapter.swapCursor(cursor);
                simpleCursorAdapter.notifyDataSetChanged();

            } catch (Exception e) {
                //todo
                e.printStackTrace();
            }

        }
    }

Метод получения View из ListView на основе позиции :

   public View getViewByPosition(int pos, ListView listView) {
        final int firstListItemPosition = listView.getFirstVisiblePosition();
        final int lastListItemPosition = firstListItemPosition + listView.getChildCount() - 1;

        if (pos < firstListItemPosition || pos > lastListItemPosition ) {
            return listView.getAdapter().getView(pos, null, listView);
        } else {
            final int childIndex = pos - firstListItemPosition;
            return listView.getChildAt(childIndex);
        }
    }

Метод проблематики c Я думаю, что этот метод, но я не могу понять его.

   private void slideOutRight(View view) {
        Animation slideRight = AnimationUtils.loadAnimation(view.getContext(), R.anim.slide_out_right);
        if (slideRight != null) {
            slideRight.setAnimationListener(new ViewAnimationListener(view) {
                @Override
                protected void onAnimationStart(View view, Animation animation) {
                    //todo set background
                }

                @Override
                protected void onAnimationEnd(View view, Animation animation) {
                    view.setVisibility(View.GONE);
                }
            });
            Log.i("view2", view.toString());
            view.startAnimation(slideRight);
        }
    }

и -

  private abstract class ViewAnimationListener implements Animation.AnimationListener {

        private final View view;

        protected ViewAnimationListener(View view) {
            this.view = view;
        }

        @Override
        public void onAnimationStart(Animation animation) {
            onAnimationStart(this.view, animation);
        }

        @Override
        public void onAnimationEnd(Animation animation) {
            onAnimationEnd(this.view, animation);
        }

        @Override
        public void onAnimationRepeat(Animation animation) {

        }

        protected abstract void onAnimationStart(View view, Animation animation);
        protected abstract void onAnimationEnd(View view, Animation animation);
    }
...