Yas*_*ers 2 android android-recyclerview
我试图每60秒更新一次recyclerView,并将新项目添加到recycler视图。
我想就使用后台服务让您从服务器检索新数据然后更新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);
}
Run Code Online (Sandbox Code Playgroud)
我的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();
}
}
Run Code Online (Sandbox Code Playgroud)
它只能工作一次,然后显示此错误:
Only the original thread that created a view hierarchy can touch its views.
Run Code Online (Sandbox Code Playgroud)
为线 mRecyclerView.scrollToPosition(0);
您正在从计划的工作线程访问RecyclerView,除了主UI线程之外,您无法更新任何视图。
mRecyclerView.scrollToPosition(0); 是罪魁祸首。
在不了解您的应用程序整体架构的情况下,我只能给您以下建议:您可以使用Handler带有主循环程序的create将该调用发回到主线程。
Handler mainThread = new Handler(Looper.getMainLooper());
...
// In your worker thread
mainThread.post(new Runnable() {
mRecyclerView.scrollToPosition(0);
});
Run Code Online (Sandbox Code Playgroud)
如果您确实只想每N秒添加一个项目,则可以使用Handler.postDelayed()并继续重新发布,直到您想停止为止。不需要工作线程。
| 归档时间: |
|
| 查看次数: |
1968 次 |
| 最近记录: |