如果适配器的数据通过RxAndroid设置,则RecyclerView在返回导航后滚动到顶部

问题描述 投票:3回答:1

当我直接设置适配器的数据时,从detial片段返回后列表的滚动位置是正确的,但如果我使用RXAndroid来处理数据,那么滚动总是跳到顶部。这是一个关于我的问题的例子:

public class ListFragment extends Fragment {

private MyAdapter adapter;
private List<String> data = new ArrayList<>();

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    for (int i = 1; i < 30; i++) {
        data.add("POS: " + i);
    }
}

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View root = inflater.inflate(R.layout.fragment_list, container, false);
    adapter = new MyAdapter();
    ((RecyclerView) root.findViewById(R.id.bone_list)).setAdapter(adapter);
    return root;
}

@Override
public void onResume() {
    super.onResume();
    data.add("POS: " + (data.size() + 1));

    // Working
    //adapter.setData(data);

    // Not working
    Observable.just(data)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Consumer<List<String>>() {
                @Override
                public void accept(List<String> strings) throws Exception {
                    adapter.setData(strings);
                }
            });
}

class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {

    private List<String> values = new ArrayList<>();

    public void setData(List<String> items) {
        values = items;
        notifyDataSetChanged();
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_list_content, parent, false));
    }

    @Override
    public void onBindViewHolder(final ViewHolder holder, int position) {
        holder.content.setText(values.get(position));
        holder.root.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                getFragmentManager().beginTransaction()
                        .replace(R.id.container, Fragment.instantiate(getContext(), DetialFragment.class.getName()))
                        .addToBackStack(null)
                        .commit();
            }
        });
    }

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

    class ViewHolder extends RecyclerView.ViewHolder {
        final View root;
        final TextView content;

        ViewHolder(View view) {
            super(view);
            root = view;
            content = (TextView) view.findViewById(R.id.content);
        }
    }
}

}

工作(简单设定数据):

enter image description here

不工作(rx):

enter image description here

谢谢,罗伯特

android android-recyclerview observable rx-android rx-java2
1个回答
0
投票

我可能会迟到但遇到同样的问题。

RecyclerView自动(与具有ID的任何视图)保存状态,但您应该在第一次布局传递之前提供数据。

因此同步adapter.setData(data)可以工作,但异步Rx操作不能。

您可以缓存数据并同步设置或直接保存并设置accept函数中的位置。

© www.soinside.com 2019 - 2024. All rights reserved.