如何在Android中动态更新RecyclerView

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);

Bre*_*age 5

您正在从计划的工作线程访问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()并继续重新发布,直到您想停止为止。不需要工作线程。