Android RecyclerView 不更新 TextView

标签 android observer-pattern

我想在回收器 View 中更改异步数据。

当调用方法 SetText() 时,滚动之前什么也不会发生。

class MainAdapter extends RecyclerView.Adapter<MainAdapter.MyViewHolder> {
    private Context context;
    private SortedList<City> items;

    public MainAdapter(Context context) {
        this.context = context;
    }

    public void add(City item){
        items.add(item);
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View row = LayoutInflater.from(context).inflate(R.layout.row, parent, false);
        return new MyViewHolder(row);
    }

    @Override
    public void onBindViewHolder(final MyViewHolder holder, final int position) {
        holder.tvTitle.setText(String.format("%d %s", items.get(position).getId(), items.get(position).getName()));

        Observable<String> observable = Observable.create(new Observable.OnSubscribe<String>() {
            @Override
            public void call(Subscriber<? super String> subscriber) {
                try {
                    //Do somethin in Background
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                subscriber.onNext(items.get(position).name);
                subscriber.onCompleted();
            }
        }).subscribeOn(Schedulers.computation());

        observable.subscribe(new Subscriber<String>() {
            @Override
            public void onCompleted() {
            }

            @Override
            public void onError(Throwable e) {
            }

            @Override
            public void onNext(String text) {
                holder.tvRowText.setText(text);
            }
        });
    }

    @Override
    public int getItemCount() {
        return items.size();
    }

    @Override
    public void onAttachedToRecyclerView(RecyclerView recyclerView) {
        super.onAttachedToRecyclerView(recyclerView);
    }

    static class MyViewHolder extends RecyclerView.ViewHolder {

        @BindView(R.id.row_title)
        public TextView tvTitle;

        @BindView(R.id.row_text)
        public TextView tvRowText;

        MyViewHolder(View row) {
            super(row);
            ButterKnife.bind(this, row);
        }
    }
}

我做错了什么?

onNext() 中调用 notifyDatachanged(i) 无效。

最佳答案

尝试使用下面的代码:

holder.tvRowText.setText(text);

在 post 调用中(它将在 UI 线程 上运行),如下所示:

holder.tvRowText.post(new runnable... emitted for brevity){
holder.tvRowText.setText(text);
}

关于Android RecyclerView 不更新 TextView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37713834/

相关文章:

android - 谷歌现在处理 whatsapp 消息传递

android - 主机未解析 : imap. gmail.com:993

android - 静态库预构建失败

android - 通知网络变化的 Activity - Android

java - 观察者设计模式

android - 找不到类 'org.codehaus.jackson.map.ObjectMapper'?

Java Swing GUI 卡住 - 观察者模式

java - 在不同的线程上执行每个日志请求

c# - 将 IObserver 分配给多个 IObservable 实例

java - 将参数传递给在单独线程中调用的函数