#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;
}