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

}

作業(簡単なセットデータ):

enter image description here

が機能していない(RX):

ここ は私の問題についての一例です

enter image description here

おかげで、 ロバート

答えて

0

は私が遅くなりますが、同じ問題を抱えて。

RecyclerViewは自動的に(IDを持つビューとして)状態を保存しますが、最初のレイアウトが通過する前にデータを提供する必要があります。

したがって、同期adapter.setData(data)は動作しますが、非同期Rx操作では動作しません。

accept機能では、データをキャッシュして同期したり、直接設定したり保存したりできます。

関連する問題