Удаление объекта пользователя из ViewModel и применение удаления для настраиваемого представления с настраиваемыми дочерними представлениями - PullRequest
0 голосов
/ 10 октября 2019

Я использую архитектуру MVVM в своем проекте.

in onCreate() Я наблюдаю за репозиторием, который дает мне список пользователей из моей базы данных Room. Позже я использую список пользователей для добавления дочерних представлений в мой настраиваемый вид, который заполняет настраиваемые дочерние представления (работает как система прокрутки карточек трутовиков, с одним основным видом, который содержит множество дочерних настраиваемых представлений как карточки, которые можно смахивать).

Итак, я хочу активировать свой метод удаления из моей модели представления, и я пытаюсь понять, что я делаю неправильно. Вот моя MainActivity -

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

  private static final int STACK_SIZE = 2;

  private TinderStackLayout tinderStackLayout;
  private OnCardSwipedListener listener;
  private UserViewModel userViewModel;
  private ArrayList<User> usersList;
  private int index = 0;

  @BindView(R.id.activity_main_delete_button)
  Button mDeleteButton;

  @BindView(R.id.activity_main_pass_button)
  Button mPassButton;

  @BindView(R.id.activity_main_approve_button)
  Button mApproveButton;



  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    observeLiveData();

    initViewsAndListeners();
  }

  private void initViewsAndListeners() {
    tinderStackLayout = findViewById(R.id.activity_main_tinder_stack_layout);
    mDeleteButton = findViewById(R.id.activity_main_delete_button);
    mPassButton = findViewById(R.id.activity_main_pass_button);
    mApproveButton = findViewById(R.id.activity_main_approve_button);
    mDeleteButton.setOnClickListener(this);
    mApproveButton.setOnClickListener(this);
    mPassButton.setOnClickListener(this);
    listener = new OnCardSwipedListener() {
      @Override
      public void send(Object object) {

      }

      @Override
      public void onNext(Integer integer) {


        if (integer == 1) {
          addCards(1);
        }

      }
    };
  }

  private void observeLiveData() {
    userViewModel = ViewModelProviders.of(this).get(UserViewModel.class);
    userViewModel.getAllUsers().observe(this, users -> {
      //update a new list of users
      usersList = (ArrayList) users;
      addCards(-1);
    });
  }


  private void addCards(int stackSizeToAdd) {
    TinderCardView tinderCardView;
    for (int i = index; index < i + (STACK_SIZE + stackSizeToAdd); index++) {
      if (index >= usersList.size()) {
        index = 0;
        i = 0;
        addCards(-1);
      }
      tinderCardView = new TinderCardView(this, listener);
      tinderCardView.bind(usersList.get(index));
      tinderStackLayout.addCard(tinderCardView);
    }
  }

  @Override
  public void onClick(View view) {
    int buttonTag = Integer.valueOf(String.valueOf(view.getTag()));
    TinderCardView topCardOnStack = tinderStackLayout.getTopCardOnStack();
    topCardOnStack.handleButtonPressed(buttonTag);
    if (buttonTag == 1) {
      userViewModel.delete(usersList.get(0)); // this should delete the first user in the list 
    }
  }
}

Как видите, я удаляю первый элемент в моей переменной userList. Дело в том, что он, кажется, на самом деле не удаляет нужного пользователя и странные функции. Я думаю, что это как-то связано с тем фактом, что я, возможно, удаляю другую карту, на которой указан другой пользователь, нежели тот, который я удаляю.

Вот мой вид custon TinderStackLayout -

public class TinderStackLayout extends FrameLayout {



  // Variable members
  private OnCardSwipedListener onCardSwipedListener;

  //Top card
  private TinderCardView topCardOnStack;



  //Constructors
  public TinderStackLayout(Context context) {
    super(context);
    init();
  }

  public TinderStackLayout(Context context, AttributeSet attrs) {
    super(context, attrs);
    init();
  }

  public TinderStackLayout(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    init();
  }

  @Override
  public void addView(View child, int index, ViewGroup.LayoutParams params) {
    super.addView(child, index, params);
    if (onCardSwipedListener != null)
      onCardSwipedListener.onNext(getChildCount());
  }

  @Override
  public void removeView(View view) {
    super.removeView(view);
    if (onCardSwipedListener != null)
      onCardSwipedListener.onNext(getChildCount());
  }

  @Override
  public void onDetachedFromWindow() {
    super.onDetachedFromWindow();
  }

  // Helper Methods
  private void init() {
    setClipChildren(false);

  }

  public void addCard(TinderCardView tinderCardView) {
    if (onCardSwipedListener == null)
      onCardSwipedListener = tinderCardView.getOnCardSwipedListener();

    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, 0, layoutParams);

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

  public TinderCardView getTopCardOnStack() {
    return topCardOnStack;
  }
}

Удаляю ли я другого пользователя, кроме моей карты? Я думаю, что даже моя переменная topCardOnStack на самом деле не дает реальной верхней карты.

Какие изменения мне нужно применить, чтобы удалить нужного пользователя и сразу же внести изменения в родительские дочерние элементы?

edit -

вот мой handleButtonPressed() метод -

public void handleButtonPressed(int buttonTag) {
    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:
        isCardAnimating = true;
        passCard(topCard);
        break;
      case APPROVE_BUTTON_PRESSED:
        showLawyerContactDetailsFragment(topCard);
        break;
    }
  }

  private void deleteCard(TinderCardView topCard) {
    topCard.mDeleteTextView.setAlpha(ALPHA_VISIBLE);
    dismissCard(topCard, -(screenWidth * 2));
  }
  private void passCard(TinderCardView topCard) {
    topCard.mPassTextView.setAlpha(ALPHA_VISIBLE);
    dismissCard(topCard, -(screenWidth * 2));
  }
private void dismissCard(final View view, int xPos) {
    view.animate()
        .x(xPos)
        .y(0)
        .setInterpolator(new AccelerateInterpolator())
        .setDuration(DURATION)
        .setListener(new Animator.AnimatorListener() {
          @Override
          public void onAnimationStart(Animator animator) {
            isCardAnimating = true;
          }
          @Override
          public void onAnimationEnd(Animator animator) {
            ViewGroup viewGroup = (ViewGroup) view.getParent();
            if (viewGroup != null) {
              isCardAnimating = false;
              viewGroup.removeView(view);
            }
          }
          @Override
          public void onAnimationCancel(Animator animator) {
          }
          @Override
          public void onAnimationRepeat(Animator animator) {
          }
        });
  }
...