RecycleView ,某些项目的子视图未正确显示

RecycleView , some items' subView doesn't show correctly

片段

mAdapter = new MessageAdapter(this);
        mRV.setLayoutManager(new LinearLayoutManager(getActivity(),LinearLayoutManager.VERTICAL,false));
        mRV.setItemAnimator(new DefaultItemAnimator());
        DividerItemDecoration itemDecoration = new DividerItemDecoration.Builder()
                .setOffsetLeft(ScreenUtil.dip2px(getActivity(), 60 + 10) + this.getResources().getDimensionPixelOffset(R.dimen.horizontal_margin))
                .build(getActivity());
        mRV.addItemDecoration(itemDecoration);
        mRV.setItemViewCacheSize(15);
        mRV.setAdapter(mAdapter);

在适配器中

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    return new MessageItemHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.w_message_item,parent,false));
}

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    ((RVItemInterface)holder).setAdapter(this);
    ((RVItemInterface)holder).update(dataList.get(position),position);
}

持有人

public class MessageItemHolder extends RecyclerView.ViewHolder implements RVItemInterface{

private RoundAvatar mAvatar;
private TextView mTitle;
private TextView mContent;
private TextView mTime;

private BaseRVAdapter mAdapter;

private MsgDecorVo mMsgDecorVo;

...

@Override
public void update(Object obj, final int position) {
    reset();
    mMsgDecorVo = (MsgDecorVo) obj;

    if(mMsgDecorVo.type == MsgDecorVo.TYPE_CATEGORY){
        updateCategory();
        MsgVo msgVo = mMsgDecorVo.msgVo;
        if(msgVo.getMsg() == null || msgVo.getMsg().equals("")){
            mContent.setVisibility(View.GONE);
        }else {
            mContent.setVisibility(View.VISIBLE);
            mContent.setText(msgVo.getMsg());
        }
        if(msgVo.getTime() == 0){
            mTime.setVisibility(View.GONE);
        }else {
            mTime.setVisibility(View.VISIBLE);
            mTime.setText(TimeUtil.transformLong2DateString(msgVo.getTime()));
        }

        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dealCategoryClick();
            }
        });

    }else if(mMsgDecorVo.type == MsgDecorVo.TYPE_CONVERSATION){

        ...

        mContent.setText(ImUtil.getMsgContent(message));
        mTime.setText(TimeUtil.transformLong2DateString(message.getMsgTime()));

        if(chatUserVo != null){
            ..

        }else {
            ..
        }
    }
}

//
private void updateCategory(){
    ...
}

//
private void dealCategoryClick(){
    ...
}

@Override
public void setAdapter(RecyclerView.Adapter adapter) {
    mAdapter = (BaseRVAdapter) adapter;
}

@Override
public void reset() {
    mAvatar.setOnClickListener(null);
    mAvatar.setAvatar(R.drawable.avatar_default_circle);
    mAvatar.hideTagBottom();
    mAvatar.hideTagTop();
}

}

holder 中的这些代码

        mContent.setText(ImUtil.getMsgContent(message));
        mTime.setText(TimeUtil.transformLong2DateString(message.getMsgTime()));

已运行

但是当我滚动时,有些项目没有正确显示,时间和内容都不见了! 如果我通知 recyclerview ,它就正确了,如果我再次滚动,它仍然是错误的

就像图片一样,您可以看到一些项目(时间和内容)不见了!

http://g.picphotos.baidu.com/album/s%3D900%3Bq%3D90/sign=297cc7510946f21fcd345253c61f1a5d/a686c9177f3e6709378bcc5538c79f3df9dc5595.jpg "tooltip"

嗯,您没有完整的代码,但我认为它正在发生,因为您没有正确重置视图状态。

例如,在您的 updateCode 中,如果类型 = TYPE_CATEGORY,您可以根据 getTime 是否为 0 来设置 mTime 的可见性。但是当你滚动时,该行可能会被重新用于 TYPE_CONVERSATION 在这种情况下,mTime 的可见性将不会更新。