为什么将我的RecyclerView适配器包装在另一个类中会导致不同的行为?

时间:2015-07-09 22:59:38

标签: android android-adapter android-recyclerview

使用RecyclerViews时遇到了一个问题。基本上在RecyclerView的初始加载期间(在我开始活动之后),在项目出现之前会有一个小的延迟。

经过一段时间的实验,我找到了一种方法来通过将我的适配器包装在另一个类中来消除这种延迟,如下所示:

public class AdapterWrapper extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    private RecyclerView.Adapter<RecyclerView.ViewHolder> mAdapter;

    public AdapterWrapper(RecyclerView.Adapter<RecyclerView.ViewHolder> adapter) {
        mAdapter = adapter;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        return mAdapter.onCreateViewHolder(parent, viewType);
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        mAdapter.onBindViewHolder(holder, position);
    }

    @Override
    public int getItemCount() {
        return mAdapter.getItemCount();
    }

    @Override
    public int getItemViewType(int position) {
        return mAdapter.getItemViewType(position);
    }
}

然后在我的活动中我有这个:

protected void onCreate(Bundle savedInstanceState) {
    ...
    setUpRecyclerView();
    ...
}

public void setUpRecyclerView() {
    mAdapter = new MyAdapter(this, mCursor);
    mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);

    //mRecyclerView.setAdapter(mAdapter);                   // This causes a small delay.
    mRecyclerView.setAdapter(new AdapterWrapper(mAdapter)); // This doesn't
}

这对我来说似乎很奇怪,我不知道为什么行为不同。有没有人有任何潜在的理论来解释这个?

额外信息:
-I使用游标加载器向我的适配器提供数据。
- 使用http://quanturium.github.io

中的CursorRecyclerAdapter对我的适配器进行子类化

2 个答案:

答案 0 :(得分:2)

您必须覆盖每个方法,而不仅仅是实现抽象方法。

当你在AdapterWrapper上调用你的override方法时,它会被传递给包装对象。每个其他方法都会转到你的包装器而不会被传递。

答案 1 :(得分:0)

如果我是对的,你的前提可能是红鲱鱼。像这样的延迟可能 - 并且通常是 - 因为您正在从后台线程执行对ui的更新。

我们遇到了类似的问题,并最终追踪到了这种情况。将代码移回主线程,一切都变得即时。

希望这有帮助!