如何在android中动态更新RecyclerView

时间:2015-08-21 17:44:34

标签: android android-recyclerview

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

1 个答案:

答案 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()并继续重新发布,直到你想要停止。工作线程不需要。