RecycleView,某些项的子视图无法正确显示

时间:2015-01-07 11:24:13

标签: android-recyclerview

片段中的

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();
}

}

这些代码在持有人

        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"工具提示"

1 个答案:

答案 0 :(得分:0)

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

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