我正在尝试每60秒更新一次recyclerView,并将新项目添加到回收站视图中。
我想建议您使用后台服务从服务器检索新数据然后更新recyclerview
要做到这一点,我必须每60秒请求一次服务器,为此我正在尝试这个测试代码:
ScheduledExecutorService scheduler =
Executors.newSingleThreadScheduledExecutor();
scheduler.scheduleAtFixedRate
(new Runnable() {
public void run() {
mAdapter.addItem(new Post("Yahhooo"));
mAdapter.notifyItemInserted(0);
mRecyclerView.scrollToPosition(0);
}
}, 0, 1, TimeUnit.MINUTES);
}
和我的Recyclerview看起来像:
public class FeedAdapter extends RecyclerView.Adapter<FeedAdapter.ViewHolder> {
private List<Post> mDataset;
public class ViewHolder extends RecyclerView.ViewHolder {
public TextView txtHeader;
public ImageView pub_image;
public ViewHolder(View v) {
super(v);
txtHeader = (TextView) v.findViewById(R.id.firstline);
pub_image = (ImageView) v.findViewById(R.id.imageView);
}
}
public FeedAdapter(List<Post> myDataset) {
mDataset = myDataset;
}
@Override
public FeedAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
int viewType) {
// create a new view
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.feedholder, parent, false);
// set the view's size, margins, paddings and layout parameters
ViewHolder vh = new ViewHolder(v);
return vh;
}
public void addItem(Post item) {
mDataset.add(item);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.txtHeader.setText(mDataset.get(position).getPost_text());
Picasso.with(holder.pub_image.getContext()).load("http://www.vivamexico.info/Peintures/DiegoRivera/Ere-01.jpg").into(holder.pub_image);
}
@Override
public int getItemCount() {
return mDataset.size();
}
}
它只运行一次,然后显示此错误:
Only the original thread that created a view hierarchy can touch its views.
代码行mRecyclerView.scrollToPosition(0);
答案 0 :(得分:4)
您正在从预定的工作线程访问您的RecyclerView,除了主UI线程之外,您无法更新任何视图。
mRecyclerView.scrollToPosition(0);
是罪魁祸首。
在不知道应用程序的整个架构的情况下,我只能给你这样的建议:你可以使用主looper创建的Handler
将该调用发回主线程。
Handler mainThread = new Handler(Looper.getMainLooper());
...
// In your worker thread
mainThread.post(new Runnable() {
mRecyclerView.scrollToPosition(0);
});
如果你真的只想每N秒添加一个项目,你可以使用Handler.postDelayed()
并继续重新发布,直到你想要停止。工作线程不需要。