2
アダプタのデータを直接設定すると、detialフラグメントから戻った後にリストのスクロール位置は正しくなりますが、RXAndroidを使用してデータを処理するとスクロールは常に先頭にジャンプします。RecyclerView 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);
}
}
}
}
作業(簡単なセットデータ):
が機能していない(RX):
ここ は私の問題についての一例です のおかげで、 ロバート