быстрая прокрутка RecyclerView, кнопка переключения в элементе будет неправильной

#android

#Android

Вопрос:

ToggleButton в моем RecyclerView item.so , все переключатели не отмечены. Но когда я быстро прокручиваю форму RecyclerView снизу вверх, список перемещается в круг … после покадровой съемки я обнаружил, что один из переключателей элемента был отмечен! это странно … код здесь, я не думаю, что есть какая-то проблема … это держатель..

 public class CommentsHolder extends RecyclerView.ViewHolder {

TextView dateTextView;
TextView contentTextView;
ImageView iconImageView;
ToggleButton hideToggleButton;

View viewBorder;
View lastViewBorder;


public CommentsHolder(View itemView) {
    super(itemView);
    dateTextView = (TextView) itemView.findViewById(R.id.dateTextView);
    contentTextView = (TextView) itemView.findViewById(R.id.contentTextView);
    iconImageView = (ImageView) itemView.findViewById(R.id.iconImageView);
    hideToggleButton = (ToggleButton) itemView.findViewById(R.id.hideToggleButton);
    viewBorder = itemView.findViewById(R.id.viewBorder);
    lastViewBorder = itemView.findViewById(R.id.lastViewBorder);
}

public void setData(final StoryDetail.Format story, int icon, boolean isLastItem) {
    String strDate = CommonFunction.genTimeString(story.comment.getCreateDate());
    dateTextView.setText(strDate);
    iconImageView.setImageResource(icon);
    contentTextView.setMaxLines(Integer.MAX_VALUE);
    contentTextView.setText(story.comment.getContent());
    if (isLastItem) {
        viewBorder.setVisibility(View.GONE);
        lastViewBorder.setVisibility(View.VISIBLE);
    } else {
        viewBorder.setVisibility(View.VISIBLE);
        lastViewBorder.setVisibility(View.GONE);
    }
    contentTextView.post(new Runnable() {
        @Override
        public void run() {
            if (contentTextView.getLineCount() <= 3) {
                hideToggleButton.setVisibility(View.INVISIBLE);
            } else {
                hideToggleButton.setVisibility(View.VISIBLE);
            }
            if (story.comment.isShowAll()) {
                contentTextView.setMaxLines(Integer.MAX_VALUE);
            } else {
                contentTextView.setMaxLines(3);
            }
        }
    });
    hideToggleButton.setOnCheckedChangeListener(null);
    hideToggleButton.setChecked(story.comment.isShowAll());
    hideToggleButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            if (isChecked) {
                contentTextView.setMaxLines(Integer.MAX_VALUE);
            } else {
                contentTextView.setMaxLines(3);
            }
            story.comment.setShowAll(isChecked);
        }
    });
}
  

это адаптер:

 class StoryAdapter extends RecyclerView.Adapter {
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView;
        RecyclerView.ViewHolder viewHolder = null;
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        switch (viewType) {
            case StoryDetail.FormatType.HEADER:
                itemView = inflater.inflate(R.layout.story_header_holder, parent, false);
                viewHolder = new HeaderViewHolder(itemView);
                break;
            case StoryDetail.FormatType.TEXT:
                itemView = inflater.inflate(R.layout.story_text_holder, parent, false);
                viewHolder = new TextViewHolder(itemView);
                break;
            case StoryDetail.FormatType.IMAGE:
                itemView = inflater.inflate(R.layout.story_image_holder, parent, false);
                viewHolder = new ImageViewHolder(itemView);
                break;
            case StoryDetail.FormatType.FROM_GRANDPA:
                itemView = inflater.inflate(R.layout.story_grandpa_letter_holder, parent, false);
                viewHolder = new GrandpaLetterHolder(itemView);
                break;
            case StoryDetail.FormatType.FROM_USER:
                itemView = inflater.inflate(R.layout.story_user_letter_holder, parent, false);
                viewHolder = new UserLetterHolder(itemView);
                break;
            case StoryDetail.FormatType.COMMENT_TITLE:
                itemView = inflater.inflate(R.layout.story_comment_title_holder, parent, false);
                viewHolder = new CommentTitleHolder(itemView);
                break;
            case StoryDetail.FormatType.COMMENT_PLACE_HOLDER:
                itemView = inflater.inflate(R.layout.story_place_holder, parent, false);
                viewHolder = new PlaceHolder(itemView);
                break;
            case StoryDetail.FormatType.RECOMMEND_COMMENT_HEADER:
                itemView = inflater.inflate(R.layout.story_rcommend_comment_header_holder, parent, false);
                viewHolder = new ReCommentHolder(itemView);
                break;
            case StoryDetail.FormatType.RECOMMEND_COMMENTS:
                itemView = inflater.inflate(R.layout.story_comments_holder, parent, false);
                viewHolder = new CommentsHolder(itemView);
                break;
            case StoryDetail.FormatType.COMMENT_HEADER:
                itemView = inflater.inflate(R.layout.story_comment_header_holder, parent, false);
                viewHolder = new CommentHeaderHolder(itemView);
                break;
            case StoryDetail.FormatType.COMMENTS:
                itemView = inflater.inflate(R.layout.story_comments_holder, parent, false);
                viewHolder = new CommentsHolder(itemView);
                break;
            case StoryDetail.FormatType.TIP:
                itemView = inflater.inflate(R.layout.story_tip_holder, parent, false);
                viewHolder = new TipHolder(itemView);
                break;
        }
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        int viewType = getItemViewType(position);
        Log.e("position-----------", position   "");
        switch (viewType) {
            case StoryDetail.FormatType.HEADER:
                HeaderViewHolder headerViewHolder = (HeaderViewHolder) holder;
                headerViewHolder.setData(storyDetail.formats.get(position));

                boolean hideSubmission =
                        TYPE_NAME_MAIL_FROM_GRANDPA.equals(storyDetail.formats.get(position).title.subtitle) ||
                                TYPE_NAME_BULLETIN.equals(storyDetail.formats.get(position).title.subtitle) ||
                                TYPE_ID_BULLETIN.equals(storyDetail.formats.get(position).title._id) ||
                                TYPE_ID_MAIL_FROM_GRANDPA.equals(storyDetail.formats.get(position).title._id);

                setSubmissionButtonState(!hideSubmission);
                break;
            case StoryDetail.FormatType.TEXT:
                TextViewHolder textViewHolder = (TextViewHolder) holder;
                textViewHolder.setData(storyDetail.formats.get(position));
                break;
            case StoryDetail.FormatType.IMAGE:
                ImageViewHolder imageViewHolder = (ImageViewHolder) holder;
                imageViewHolder.setData(storyDetail.formats.get(position));
                break;
            case StoryDetail.FormatType.FROM_GRANDPA:
                GrandpaLetterHolder grandpaLetterHolder = (GrandpaLetterHolder) holder;
                grandpaLetterHolder.setData(storyDetail.formats.get(position));
                break;
            case StoryDetail.FormatType.FROM_USER:
                UserLetterHolder userLetterHolder = (UserLetterHolder) holder;
                userLetterHolder.setData(storyDetail.formats.get(position));
                break;
            case StoryDetail.FormatType.COMMENT_TITLE:
                break;
            case StoryDetail.FormatType.COMMENT_PLACE_HOLDER:
                break;
            case StoryDetail.FormatType.RECOMMEND_COMMENT_HEADER:
                break;
            case StoryDetail.FormatType.RECOMMEND_COMMENTS:
                Log.e("position", position   "");
                CommentsHolder commentsHolder = (CommentsHolder) holder;
                commentsHolder.setData(storyDetail.formats.get(position), R.mipmap.story_comment_icon_brown,
                        position   1 < getItemCount() amp;amp; storyDetail.formats.get(position   1).type != StoryDetail.FormatType.RECOMMEND_COMMENTS);
                break;
            case StoryDetail.FormatType.COMMENT_HEADER:
                break;
            case StoryDetail.FormatType.COMMENTS:
                CommentsHolder commentsHolder1 = (CommentsHolder) holder;
                commentsHolder1.setData(storyDetail.formats.get(position), R.mipmap.story_comment_mine_icon_black, false);
                break;
            case StoryDetail.FormatType.TIP:
                TipHolder tipHolder = (TipHolder) holder;
                tipHolder.setData(storyDetail.formats.get(position));
                break;
        }

    }

    @Override
    public int getItemCount() {
        if (storyDetail == null || storyDetail.formats == null) {
            return 0;
        }
        return storyDetail.formats.size();
    }

    @Override
    public int getItemViewType(int position) {
        super.getItemViewType(position);
        return storyDetail.formats.get(position).type;
    }
}
  

пожалуйста, помогите мне. большое спасибо ~

Комментарии:

1. вы можете поместить журнал для story.comment.isShowAll(), чтобы проверить, в каком состоянии ваше значение становится истинным

2. на самом деле, я знаю, какой элемент будет проверен. но он не всегда находится в одном и том же положении….

3. okk .. в методе onBindViewHolder, если вы устанавливаете флажок на переключатель в любом условии if, тогда в состоянии else вы должны снять его

4. что ж, я попробую, спасибо ~

5. @yibozhange okk дайте мне знать, если это сработает для вас

Ответ №1:

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

что-то вроде приведенного ниже

   @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.some_layout, parent, false);
        ViewHolder holder;

        //setting the tags to the viewholder to avoid duplicate views when recycling
        if (view.getTag() == null) {
            holder = new ViewHolder(view);
            view.setTag(holder);
        } else {
            holder = (ViewHolder) view.getTag();
        }
        return holder;
    }