RecyclerView GridLayoutManager项目随机移动位置

时间:2017-05-25 10:21:39

标签: android android-recyclerview gridlayoutmanager

在RecyclerView中使用gridlayout我观察到每当我在屏幕上出现4-5个项目时,项目会改变位置,我已经实现了onclick以便它会进入另一个页面

public interface ItemClickCallback {
    void onItemClick(int p, String id);

}

public void setItemClickCallback(final ItemClickCallback itemClickCallback) {
    this.itemClickCallback = itemClickCallback;

}

public nAdapter(RealmResults<Nitem> listData, Context c) {
    inflater = LayoutInflater.from(c);
    this.listData = listData;
}


@Override
public nHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = inflater.inflate(R.layout.n_item, parent, false);
    return new nHolder(view);
}

@Override
public void onBindViewHolder(nAdapter.nHolder holder, final int position) {
    final Nitem item = (Nitem) listData.get(position);
    holder.title.setPadding(7,7,7,7);
    if(holder.title.toString().isEmpty()) {
        holder.title.setText(item.getNotes());
    }
        holder.container.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            itemClickCallback.onItemClick(position,item.getId());
        }
    });

}

1 个答案:

答案 0 :(得分:0)

RecyclerView中的视图可以重复使用。

这意味着当您向上或向下滚动列表时,不是创建全新的视图,而是重复使用先前创建的视图。

隐含地,它强制您一次又一次地更新视图内容(不仅在您期望它为空时)。

可能你有错位标题的问题?之所以会发生这种情况,是因为您只设置标题,当它为空时(仅对少数尚未缓存的视图才有效)。

只需删除if条件就可以了。

@Override
public void onBindViewHolder(nAdapter.nHolder holder, final int position) {
    final Nitem item = (Nitem) listData.get(position);
    holder.title.setPadding(7,7,7,7);
    // Always update view's data.
    holder.title.setText(item.getNotes());
    holder.container.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            itemClickCallback.onItemClick(position,item.getId());
        }
    });
}