Кнопка изображения не передает изменения в recyclerView - PullRequest
0 голосов
/ 30 августа 2018

спасибо за помощь. Я пытался реализовать функцию добавления в избранное в моем представлении переработчика, все работает нормально, кроме одной вещи. Я не могу зафиксировать измененную кнопку изображения в окне рециркуляции, каждый раз, когда я нажимаю кнопку, сообщение добавляется в избранное, а кнопка изображения становится желтой, но как только я перехожу к другому фрагменту, желтая кнопка исчезает. вернуться к своей начальной стадии. Может ли кто-нибудь из вас помочь мне с тем, как заставить мою кнопку зафиксировать изменения в представлении переработчика. Ниже мой соответствующий код.

Инициализация кнопок в классе держателя:

class UsersViewHolder1 extends RecyclerView.ViewHolder {

        View mView;

        private ImageButton mFavouritesBlack, mFavouritesYellow;
        private GestureDetector mGestureDetector;
        private Heart mHeart;


        public UsersViewHolder1(View itemView) {
            super(itemView);

            mView = itemView;
            mFavouritesBlack = mView.findViewById(R.id.ad_start_fav);
            mFavouritesYellow = mView.findViewById(R.id.ad_start_fav1);
       }
}

Класс OnBindViewHOlder (я опустил нерелевантный код):

protected void onBindViewHolder(@NonNull final UsersViewHolder1 Holder, final int position, @NonNull
                    Ad ad) {
                Holder.setTitle(ad.getTitle());
                Holder.setPrice(ad.getPrice());
                Holder.setCategory(ad.getCategory());
                Holder.setImage(ad.getImage(), getContext());
                Holder.setTime(ad.getTime());


                String user_id = getRef(position).getKey();
                final String kk = user_id.toString();

                Holder.mView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Intent mew = new Intent(getActivity(), ExpandActivity.class);
                        mew.putExtra("user_id", kk);
                        startActivity(mew);

                    }
                });


                Holder.mFavouritesBlack.setOnTouchListener(new View.OnTouchListener() {
                    @Override
                    public boolean onTouch(View view, MotionEvent motionEvent) {

                        mFav.child(puid).child(kk).child("fav_status").setValue("Added as fav").addOnSuccessListener(new OnSuccessListener<Void>() {
                            @Override
                            public void onSuccess(Void aVoid) {
                                Toast.makeText(getContext(),"Added to Fav",Toast.LENGTH_SHORT).show();

                                if (Holder.mFavouritesBlack.isShown())
                                Holder.mFavouritesBlack.setVisibility(View.GONE);
                                Holder.mFavouritesYellow.setVisibility(View.VISIBLE);


                            }
                        });
                        return true;
                    }
                });
                Holder.mFavouritesYellow.setOnTouchListener(new View.OnTouchListener() {
                    @Override
                    public boolean onTouch(View view, MotionEvent motionEvent) {
                        mFav.child(puid).child(kk).removeValue().addOnSuccessListener(new OnSuccessListener<Void>() {
                            @Override
                            public void onSuccess(Void aVoid) {
                                Toast.makeText(getContext(),"Removed from Fav",Toast.LENGTH_SHORT).show();
                                if (Holder.mFavouritesYellow.isShown())
                                Holder.mFavouritesBlack.setVisibility(View.VISIBLE);
                                Holder.mFavouritesYellow.setVisibility(View.GONE);




                            }
                        });
                        return true;
                    }
                });

            }

Ответы [ 3 ]

0 голосов
/ 30 августа 2018

Это потому, что вы сохраняете флаги, когда происходит щелчок, но когда перерисовываются представления, вы не сбрасываете изображения соответственно. Внутри onBindViewHolder добавьте следующий код.

//Replace the if condition statement with the state value check(Abstract code shown below)
if(mFav.child(puid).child(kk).child("fav_status").getValue(),equals("Added as fav")){
  Holder.mFavouritesBlack.setVisibility(View.GONE);
  Holder.mFavouritesYellow.setVisibility(View.VISIBLE);
}else{
  Holder.mFavouritesBlack.setVisibility(View.VISIBLE);
  Holder.mFavouritesYellow.setVisibility(View.GONE);
}
0 голосов
/ 31 августа 2018

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

 mFav.addValueEventListener(new ValueEventListener() {
               @Override
               public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                   if (dataSnapshot.child(puid).hasChild(kk)){
                       Holder.mFavouritesBlack.setVisibility(View.GONE);
                       Holder.mFavouritesYellow.setVisibility(View.VISIBLE);

                   }else{
                       Holder.mFavouritesBlack.setVisibility(View.VISIBLE);
                       Holder.mFavouritesYellow.setVisibility(View.GONE);
                   }
               }

               @Override
               public void onCancelled(@NonNull DatabaseError databaseError) {

               }
           });
 Holder.mFavouritesBlack.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View view, MotionEvent motionEvent) {

                    mFav.child(puid).child(kk).child("fav_status").setValue("Added as fav").addOnSuccessListener(new OnSuccessListener<Void>() {
                        @Override
                        public void onSuccess(Void aVoid) {
                            Toast.makeText(getContext(), "Added to Fav", Toast.LENGTH_SHORT).show();

                            if (!itemStateArray.get(adapterPosition, false))
                                Holder.mFavouritesBlack.setVisibility(View.GONE);
                            Holder.mFavouritesYellow.setVisibility(View.VISIBLE);


                        }
                    });
                    return true;
                }
            });
            Holder.mFavouritesYellow.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View view, MotionEvent motionEvent) {
                    mFav.child(puid).child(kk).removeValue().addOnSuccessListener(new OnSuccessListener<Void>() {
                        @Override
                        public void onSuccess(Void aVoid) {
                            Toast.makeText(getContext(), "Removed from Fav", Toast.LENGTH_SHORT).show();
                            if (itemStateArray.get(adapterPosition, false))
                                Holder.mFavouritesBlack.setVisibility(View.VISIBLE);
                            Holder.mFavouritesYellow.setVisibility(View.GONE);


                        }
                    });
                    return true;
                }
            });

Но огромное спасибо всем, кто пытался помочь.

0 голосов
/ 30 августа 2018

То, что вы пытаетесь реализовать, - это выделение внутри окна повторного просмотра, которое требует сохранения состояния, то есть вам придется сохранять избранные элементы, скажем, в массиве SparseBooleanArray, который можно использовать для сохранения избранных позиций адаптера, а внутри onBindViewHolder проверять, если избранное массив содержит позицию адаптера и переключение вида изображения (нет необходимости использовать два изображения, вместо этого вы можете изменить цвет рисования), пожалуйста, обратитесь этот artcle

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