【问题标题】:Recyclerview adapter initialised with empty array and subsequently populated with valuesRecyclerview 适配器用空数组初始化,随后用值填充
【发布时间】:2015-06-15 17:35:02
【问题描述】:

我正在我的 onCreate 方法中创建一个带有空列表的 recyclerview 适配器。这样做是必要的,因为标记到 mAdapter 是一个滚动侦听器,如果我向上滚动,它允许我从数据库服务器获取另一个页面(为简洁起见,我没有复制和粘贴该代码)。

public class MainActivity extends ActionBarActivity {

ArrayList<Post> totalPost = new ArrayList<>();

 @Override
 protected void onCreate(Bundle savedInstanceState) {
        mAdapter = new MyAdapter(totalPost, mRecyclerView);
        mRecyclerView.setAdapter(mAdapter); }

我在 onResume 中调用我的网络操作,而 onResume 发生在 onCreate 之后。

一旦我从网络操作中获得成功,我就会这样做,但是什么都没有发生:

 totalPost = Lists.newArrayList(result.getPosts()); //saving the network results into an array
 mAdapter.notifyDataSetChanged();

我也试过这个:

totalPost = Lists.newArrayList(result.getPosts()); //saving the network results into an array
mAdapter.notifyItemRangeChanged(0, totalPost.size());

我也试过这个,它有效,但并不理想。我在这里创建了一个新的适配器,我也失去了我的滚动监听器。我也不能在引用我的网络操作的方法中引用我的滚动侦听器,因为那将是“循环引用”:

totalPost = Lists.newArrayList(result.getPosts()); //saving the network results into an array
mAdapter = new MyAdapter(totalPost, mRecyclerView);
mRecyclerView.setAdapter(mAdapter);

为什么适配器不工作?

【问题讨论】:

    标签: android adapter android-recyclerview


    【解决方案1】:

    我认为您的适配器没有采用新值。尝试创建一个在适配器类中定义的方法,并使用传入的新值调用该方法。像这样:

    totalPost = Lists.newArrayList(result.getPosts());
    mAdapter.update(totalPost, mRecyclerView)
    

    // 适配器类

    public void update(ArrayList<Post> totalP, RecyclerView recycler) {
        totalPost = totalP;
        mRecyclerView = recycler;
        this.notifyDataSetChanged();
    

    【讨论】:

    • 我做了类似的事情并且它有效,但我真的不明白为什么我的适配器没有接受新值。 public void refill(ArrayList 帖子) { this.posts.clear(); this.posts.addAll(posts); notifyDataSetChanged(); }
    • 我相信它没有采用新值,因为当您调用 notifyDataSetChanged 时,适配器会采用它的局部变量 totalPosts 中的值,这只是旧值。
    【解决方案2】:

    您应该使用 add 函数扩展您的适配器。 创建适配器并将其分配给 recyclerview 后,您应该通过适配器与 recyclerview 进行“通信”。 将类似的内容添加到您的适配器。 其中 mItems 是适配器中的内部支持数组。

    public void addAll(int location, Collection<T> items) {
        mItems.addAll(location, items);
        notifyItemRangeInserted(location, items.size());
    }
    
    public void add(T item, int position) {
        mItems.add(position, item);
        notifyItemInserted(position);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-05
      • 1970-01-01
      • 1970-01-01
      • 2015-09-15
      • 1970-01-01
      • 2011-08-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多