Я использую архитектуру 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) {
}
});
}