Удаление дочернего вида из первой позиции и добавление его в последнюю позицию - PullRequest
0 голосов
/ 13 октября 2019

У меня есть пользовательское представление под названием TinderStackLayout. В определенной части кода я удаляю дочерний вид и снова добавляю его в последнюю возможную позицию -

private void handleViewAfterAnimation(View view, boolean shouldSkipView) {
    Log.d("card view - ", "inside handleViewAfterAnimation");
    isCardAnimating = false;
    TinderStackLayout tinderStackLayout = (TinderStackLayout) view.getParent();
    if (tinderStackLayout == null)
      return;
    tinderStackLayout.removeView(view);
    if (shouldSkipView)
      tinderStackLayout.addCard((TinderCardView) view, tinderStackLayout.getChildCount() - 1);

    //this part is for debugging purpose 
    for (int i = 0; i < tinderStackLayout.getChildCount(); i++) {
      View childAt = tinderStackLayout.getChildAt(i);
      if (childAt instanceof TinderCardView)
        Log.d("card view - ", "child cards after deletion - " + (((TinderCardView) childAt).usernameTextView.getText()));
    }

  }

, вот мой метод addCard() -

public void addCard(TinderCardView tinderCardView, int addToPosition) {
    View topCard = getChildAt(0);
    if (topCard != null && topCard.equals(tinderCardView)) {
      return;
    }

    topCardOnStack = tinderCardView;

    ViewGroup.LayoutParams layoutParams;
    layoutParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);

    addView(tinderCardView, addToPosition, layoutParams);

//    tinderCardView.animate()
//        .x(0)
//        .setInterpolator(new AnticipateOvershootInterpolator());
  }

Что я не понимаю, так это то, что я получаю в интерфейсе - у меня есть 3 карты. Я нажимаю кнопку, одна карта анимируется, вторая показывается. Я снова нажимаю кнопку, второй оживляет прочь. Я нажимаю последний и кнопка больше не работает. Чего я хочу добиться, так это первой карты, появившейся теперь за последней.

Вот что я получаю при выводе значений -

enter image description here

кажется правильным, это было до нажатия 3 2 1, а теперь 2 3 1. Следующим должно быть 1 2 3, но это то, что я получаю для следующего -

enter image description here

восходит к 3 2 1 вместо 1 2 3. Я не могу понять, почему. ?

Редактировать:

нашел причину, по которой это происходит, я даю представление, которое всегда должно быть главной картой в стеке, но на самом деле я не даюверхняя карта, потому что я всегда добавляю новую карту. Вот метод -

public void handleButtonPressed(int buttonTag) {
    Log.d("card view - ", "inside handleButtonPressed");
    TinderStackLayout tinderStackLayout = ((TinderStackLayout) this.getParent());
    TinderCardView topCard = (TinderCardView) tinderStackLayout.getChildAt(tinderStackLayout.getChildCount() - 1);
    if (isCardAnimating) {
      return;
    }
    switch (buttonTag) {
      case DELETE_BUTTON_PRESSED:
        isCardAnimating = true;
        deleteCard(topCard);
        break;
      case PASS_BUTTON_PRESSED:
        Log.d("card view - ", "inside pass button pressed");
        isCardAnimating = true;
        passCard(topCard);
        Log.d("card view - ", "top card Value before pass - " + topCard.displayNameTextView.getText());
        Log.d("card view - ", "child count - " + tinderStackLayout.getChildCount());
        for (int i = 0; i < tinderStackLayout.getChildCount(); i++) {
          View childAt = tinderStackLayout.getChildAt(i);
          if (childAt instanceof TinderCardView)
            Log.d("card view - ", "child cards before deletion - " + (((TinderCardView) childAt).usernameTextView.getText()));
        }
        break;
      case APPROVE_BUTTON_PRESSED:
        showLawyerContactDetailsFragment(topCard);
        break;
    }
  }

Я пытаюсь сделать TinderCardView topCard = (TinderCardView) tinderStackLayout.getChildAt(tinderStackLayout.getChildCount() - 1), чтобы получить верхнюю карту в моем стеке, что было бы правильно, если бы я удалил карты и не добавил их в свою карту. стек, но это не тот случай, когда их добавление. Каким должно быть решение, чтобы всегда получать верхнюю карту, когда я постоянно добавляю новые просмотры?

1 Ответ

0 голосов
/ 14 октября 2019

Если вы хотите перетасовать карты, вам не нужно удалять и повторно добавлять их. Вам просто нужна структура данных, которая сделает это за вас. Для вашего случая использования вы можете использовать круговой массив.

private CircularArray cardArray;  //declaration

Теперь, когда вы добавляете свои представления, добавьте их также в массив карт.

cardArray.addLast(tinderCardView);
addView(tinderCardView); // add to your layout.

Затем используйте этот код для проверки.

int shuffleCount = 3;
for (int i = 1; i <= shuffleCount; i++)
    shuffleTopCard(i);

Наконец, метод shuffleTopCard ().

private void shuffleTopCard(int shuffleID) {
    Log.d(TAG, "shuffleTopCard: cards before shuffle");
    for (int i = 0; i < cardCount; i++)
        Log.d(TAG, "shuffleTopCard: " + ((TinderCardView) cardArray.get(i)).getTag());

    TinderCardView cardView = (TinderCardView) cardArray.popLast();

    Log.e(TAG, "shuffleTopCard: top cardID = " + cardView.getTag());
    cardArray.addFirst(cardView);

    Log.d(TAG, "shuffleTopCard: cards after shuffling " + shuffleID + " time");
    for (int i = 0; i < cardArray.size(); i++)
        Log.d(TAG, "shuffleTopCard: " + ((TinderCardView) cardArray.get(i)).getTag());

    Log.e(TAG, "shuffleTopCard: after shuffle top card = " + ((TinderCardView) cardArray.getLast()).getTag());
}

Использование CircularArray избавит вас от головной боли от поддержания положения карты вручную, а также разделит вашу логику CustomViewGroup и перемешивание карты, что приведет к получению слабосвязанного кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...