代码之家  ›  专栏  ›  技术社区  ›  Bo Z

回收网格中的错误。更改用户界面而不随机单击

  •  0
  • Bo Z  · 技术社区  · 7 年前

    我有一个回收内部碎片在视图寻呼机。

    它在用户界面中随机地对用户帐户添加了likes,但在数据库中一切都很好。 在日志中,我看到random对BD没有影响,所以bug只出现在UI部分。刷新列表后,它可以再次出现,然后消失。 我想共享代码,但我已经不知道问题在哪里了。它可能位于adapter/refresh list listener/XML或任何其他位置。请让我知道你需要什么部分的代码,我会提供它。也许它本身就是一个回收器的缺陷,我无法修复它。

    适配器类代码:

    public class SearchAdapter extends RecyclerView.Adapter<SearchAdapter.UserViewHolder>{
    
        private List<FsUser> fsUserList = new ArrayList<>();
        private OnItemClickListener.OnItemClickCallback onItemClickCallback;
        private OnItemClickListener.OnItemClickCallback onChatClickCallback;
        private OnItemClickListener.OnItemClickCallback onLikeClickCallback;
        private Context context;
    
    
    
        public SearchAdapter(OnItemClickListener.OnItemClickCallback onItemClickCallback,
                             OnItemClickListener.OnItemClickCallback onChatClickCallback,
                             OnItemClickListener.OnItemClickCallback onLikeClickCallback) {
            this.onItemClickCallback = onItemClickCallback;
            this.onChatClickCallback = onChatClickCallback;
            this.onLikeClickCallback = onLikeClickCallback;
        }
    
        public void addUsers(List<FsUser> userList) {
            fsUserList.addAll(userList);
            notifyItemRangeInserted(fsUserList.size() - userList.size(), fsUserList.size());
        }
    
        public void clearData(){
            fsUserList.clear();
            notifyDataSetChanged();
        }
    
        @NonNull
        @Override
        public UserViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            context = parent.getContext();
            View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_user, parent, false);
            return new UserViewHolder(v);
        }
    
        @Override
        public void onBindViewHolder(@NonNull UserViewHolder holder, int position) {
            FsUser fsUser = fsUserList.get(position);
            holder.bind(fsUser, position);
        }
    
        @Override
        public int getItemCount() {
            return fsUserList.size();
        }
    
        public String getLastItemId(){
            return fsUserList.get(fsUserList.size() - 1).getUid();
        }
    
        class UserViewHolder extends RecyclerView.ViewHolder {
            RelativeLayout container;
            ImageView imageView, like, chat;
            TextView name, country;
    
            private LottieAnimationView animationView;
    
            UserViewHolder(View itemView) {
                super(itemView);
                context = itemView.getContext();
                container = itemView.findViewById(R.id.item_user_container);
                imageView = itemView.findViewById(R.id.user_img);
                like = itemView.findViewById(R.id.search_btn_like);
                chat = itemView.findViewById(R.id.search_btn_chat);
                name = itemView.findViewById(R.id.user_name);
                country = itemView.findViewById(R.id.user_country);
                animationView = itemView.findViewById(R.id.lottieAnimationView);
            }
    
            void bind(FsUser fsUser, int position){
                ViewCompat.setTransitionName(imageView, fsUser.getName());
    
                if (FirebaseUtils.isUserExist() && fsUser.getUid() != null) {
                    new FriendRepository().isLiked(fsUser.getUid(), flag -> {
                        if (flag) {
                            like.setBackground(ContextCompat.getDrawable(context, R.drawable.ic_favorite));
                            animationView.setVisibility(View.VISIBLE);
                        }
                    });
                }
    
                if(fsUser.getUid() != null) {
                    chat.setOnClickListener(new OnItemClickListener(position, onChatClickCallback));
                    like.setOnClickListener(new OnItemClickListener(position, onLikeClickCallback));
                }
    
                imageView.setOnClickListener(new OnItemClickListener(position, onItemClickCallback));
                imageView.setScaleType(ImageView.ScaleType.FIT_XY);
    
                if(fsUser.getImage().equals("default")){
                    Glide.with(context).load(context.getResources().getDrawable(R.drawable.default_avatar)).into(imageView);
                } else {
                    Glide.with(context).load(fsUser.getImage()).thumbnail(0.5f).into(imageView);
                }
    
                name.setText(fsUser.getName());
                country.setText(fsUser.getCountry());
    
                ValueAnimator animator = ValueAnimator.ofFloat(0f, 1f).setDuration(500);
                animator.addUpdateListener(valueAnimator ->
                        animationView.setProgress((Float) valueAnimator.getAnimatedValue()));
    
                if (animationView.getProgress() == 0f) {
                    animator.start();
                } else {
                    animationView.setProgress(0f);
                }
            }
        }
    
    }
    

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/item_user_container"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    
        <android.support.v7.widget.CardView
            android:layout_width="@dimen/user_cv_width"
            android:layout_height="@dimen/user_cv_height"
            android:layout_margin="@dimen/dp4"
            android:elevation="@dimen/dp4">
    
            <RelativeLayout
                android:id="@+id/item_user_main_relative_container"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content">
    
                <RelativeLayout
                    android:id="@+id/item_user_top_relative_container"
                    android:layout_width="@dimen/user_rl_width"
                    android:layout_height="@dimen/user_rl_height">
    
                    <ImageView
                        android:id="@+id/user_img"
                        android:layout_width="fill_parent"
                        android:layout_height="fill_parent"
                        android:scaleType="centerCrop"
                        android:src="@drawable/default_avatar" />
    
    
                    <RelativeLayout
                        android:id="@+id/item_user_top_relative"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_alignParentBottom="true">
    
                        <LinearLayout
                            android:layout_width="match_parent"
                            android:layout_height="wrap_content"
                            android:background="@color/user_item_bg"
                            android:orientation="vertical">
                            <TextView
                                android:id="@+id/user_name"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:layout_marginStart="@dimen/dp4"
                                android:textColor="@android:color/white"
                                android:textSize="@dimen/medium_text_size" />
    
                            <TextView
                                android:id="@+id/user_country"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:textColor="@android:color/white"
                                android:layout_marginStart="@dimen/dp4"
                                android:textSize="@dimen/medium_text_size" />
                        </LinearLayout>
                    </RelativeLayout>
                </RelativeLayout>
    
                <RelativeLayout
                    android:id="@+id/item_user_bottom_relative_container"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_alignParentBottom="true">
    
                    <LinearLayout
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_centerInParent="true"
                        android:orientation="horizontal">
                        <RelativeLayout
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_margin="@dimen/dp12">
                            <ImageView
                                android:id="@+id/search_btn_like"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:src="@drawable/heart_outline"
                                android:contentDescription="@string/search_btn_like_desc"/>
                            <com.airbnb.lottie.LottieAnimationView
                                android:id="@+id/lottieAnimationView"
                                android:visibility="gone"
                                android:layout_width="@dimen/lottie_animation_view_size"
                                android:layout_height="@dimen/lottie_animation_view_size"
                                app:lottie_loop="true"
                                app:lottie_autoPlay="true"
                                app:lottie_fileName="like.json"/>
                        </RelativeLayout>
    
                        <ImageView
                            android:id="@+id/search_btn_chat"
                            android:layout_width="0dp"
                            android:layout_height="wrap_content"
                            android:layout_margin="@dimen/dp12"
                            android:layout_weight="1"
                            android:src="@drawable/message_outline" />
                    </LinearLayout>
                </RelativeLayout>
            </RelativeLayout>
        </android.support.v7.widget.CardView>
    
    </RelativeLayout>
    

    enter image description here

    0 回复  |  直到 7 年前
        1
  •  1
  •   Gastón Saillén Michael Lehenbauer    7 年前

    在适配器中重写这两个方法

    @Override
    public long getItemId(int position) {
                return position;
    }
    
    @Override
    public int getItemViewType(int position) {
           return position;
    }