【问题标题】:Data is not inserting dynamically in RecyclerView from sqlite数据未从 sqlite 动态插入 RecyclerView
【发布时间】:2016-11-22 13:56:24
【问题描述】:

大家好,我正在尝试在 Recyclerview 中动态加载数据,这是我的代码:

PostAdapter.java

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

ArrayList<Post> listData;
String rpostid, ruserid, rname, rcat, rdate, rtittle;

public PostAdapter(ArrayList<Post> postList) {
    this.listData = postList;
    notifyDataSetChanged();
}

public PostAdapter(ArrayList<Post> postList,int i) {
    this.listData = postList;
    this.notifyItemRangeInserted(getItemCount()+1,i);
}

@Override
public PostAdapter.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
    View v = LayoutInflater.from(viewGroup.getContext())
            .inflate(R.layout.post_item, viewGroup, false);
    return new posts(v);
}

public class posts extends ViewHolder {
    TextView tvTittle, tvPostId, tvUseId, tvName, tvCat, tvDate;

    public posts(View v) {
        super(v);
        /* View stuf */
    }
}

@Override
public void onBindViewHolder(ViewHolder viewHolder, int position) {

    final posts holder = (posts) viewHolder;
    Post post = listData.get(position);
    rpostid = post.getPost_id();
    ruserid = post.getUser_id();
    rname = post.getUser_name();
    rcat = post.getPost_cat();
    rdate = post.getPost_time();
    rtittle = post.getPost_title();
    holder.tvPostId.setText(rpostid);
    holder.tvUseId.setText(ruserid);
    holder.tvName.setText(rname);
    holder.tvCat.setText(rcat);
    holder.tvDate.setText(rdate);
    holder.tvTittle.setText(rtittle);
}

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

}

这是我在调用 swipeToRefresh 时更新数据的代码

public void newPost(int s){
    postNew = handler.getNewPost(s);//getting data from DB
    postList.addAll(postNew);
    adapter = new PostAdapter(postNew);   
    listView.setAdapter(adapter);
}

这是滚动时在底部添加数据的代码

public void oldPost(int s){
    postNew = handler.getOldPost(s);// getting data from db
    postList.addAll(postNew);
    adapter = new PostAdapter(postNew,postNew.size());
    listView.setAdapter(adapter);
}

我想在调用 SwipeToRefresh 时在 recyclerView 顶部动态插入数据,并希望在向下滚动时在 recyclerview 底部显示旧数据。新数据被插入但不是动态的,而是 recyclerview 刷新并进入它的开头。

所有的东西都工作正常,比如进入 recycleview 的底部并调用 oldPost() + 滑动刷新以调用 newPost() 。问题只是数据没有动态加载,请帮助我。提前致谢。

【问题讨论】:

标签: android android-recyclerview notifydatasetchanged


【解决方案1】:

编辑后更新:

您需要将更新代码移出构造函数并移至普通方法,构造函数“构造”一个​​新对象实例并且不会神奇地更新任何内容:

public void InsertInPoistion(ArrayList<Post> postList,int i) {
    int begin = listData.size();
    this.listData.addAll(postList);
    int end = listData.size();
    this.notifyItemRangeInserted(begin ,end);
}

然后在您的片段/活动中调用此方法:

mAdapter.InsertInPoistion(postNew,postNew.size());

这里的 mAdapter 是您第一次实例化适配器后保留的参考。只在 onCreate() 中创建一个新的适配器

【讨论】:

  • @Ramin,在 onBindViewHolder 中,所有值都已绑定,但我没有在代码中显示此内容,请检查我的问题,我更新了编码部分。
【解决方案2】:

为什么不使用 contentprovider 和 LoaderCallback。我会自动为你做这一切。

查看我的示例 https://github.com/codephillip/CarContentProvider

可能会有帮助

【讨论】:

  • 我的所有代码都已设置好,我即将正常工作,如果我使用这个示例,则需要几天时间来理解 + 实现,因为我是 android 中的新手..... .
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-10
相关资源
最近更新 更多