数据未从 sqlite 动态插入 RecyclerView
Data is not inserting dynamically in RecyclerView from sqlite
大家好,我正在尝试在 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 刷新并转到其开头。
一切正常,比如获取回收视图的底部并调用 oldPost() + 滑动刷新以调用 newPost()。问题只是数据没有动态加载,请帮助我。提前致谢。
编辑后更新:
您需要将更新代码移出构造函数并移至普通方法,构造函数 "constructs" 一个新的对象实例并且不会神奇地更新任何内容:
public void InsertInPoistion(ArrayList<Post> postList,int i) {
int begin = listData.size();
this.listData.addAll(postList);
int end = listData.size();
this.notifyItemRangeInserted(begin ,end);
}
然后在你的 fragment/activity:
中调用这个方法
mAdapter.InsertInPoistion(postNew,postNew.size());
此处的mAdapter 是您在第一次实例化适配器后保留的参考。仅在 onCreate()
中创建一个新适配器
为什么不使用 contentprovider 和 LoaderCallback。我会自动为你做这一切。
查看我的例子
https://github.com/codephillip/CarContentProvider
可能会有帮助
大家好,我正在尝试在 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 刷新并转到其开头。
一切正常,比如获取回收视图的底部并调用 oldPost() + 滑动刷新以调用 newPost()。问题只是数据没有动态加载,请帮助我。提前致谢。
编辑后更新:
您需要将更新代码移出构造函数并移至普通方法,构造函数 "constructs" 一个新的对象实例并且不会神奇地更新任何内容:
public void InsertInPoistion(ArrayList<Post> postList,int i) {
int begin = listData.size();
this.listData.addAll(postList);
int end = listData.size();
this.notifyItemRangeInserted(begin ,end);
}
然后在你的 fragment/activity:
中调用这个方法mAdapter.InsertInPoistion(postNew,postNew.size());
此处的mAdapter 是您在第一次实例化适配器后保留的参考。仅在 onCreate()
中创建一个新适配器为什么不使用 contentprovider 和 LoaderCallback。我会自动为你做这一切。
查看我的例子 https://github.com/codephillip/CarContentProvider
可能会有帮助