2

設置適配器的數據當我設置適配器的數據直接,則列表的滾動位置是正確的我來自產品詳情片段回來後,但如果我使用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功能設定位置。