如何在 android 中动态更新 RecyclerView

How to update RecyclerView dynamically in android

我尝试每 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);

您正在从计划的工作线程访问您的 RecyclerView,除了主 UI 线程之外,您无法从任何其他线程更新视图。

mRecyclerView.scrollToPosition(0); 是罪魁祸首。

在不知道你的应用程序的整个架构的情况下,我只能给你这个建议:你可以使用一个 Handler 通过主循环器创建的 post 回调到主线程。

Handler mainThread = new Handler(Looper.getMainLooper());
...
// In your worker thread
mainThread.post(new Runnable() {
    mRecyclerView.scrollToPosition(0);
});

如果您真的只想每 N 秒添加一个项目,您可以使用 Handler.postDelayed() 并继续重新 posting 直到您想停止。不需要工作线程。