【问题标题】:GridLayoutManager scrollToPosition doesn't scrollGridLayoutManager scrollToPosition 不滚动
【发布时间】:2017-07-07 07:36:06
【问题描述】:

我将RecyclerViewposition 从第一个FirstFragment 传递到SecondFragment 并且它有效。在滚动那个之后,我再次得到position,并将它传递给FirstFragment。但是,当FirstFragment 获得position 时,列表不会滚动到该特定索引。

第一个片段

public class FirstFragment extends BaseFragment implements FirstAdapter.OnItemInteractionListener {

FragmentFirstBinding mBinder;
List<MyItem> mMyItemList;
GridLayoutManager mManager;
MyItem mMyItem;
FirstAdapter mAdapter;
int mPosition;

private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
public static final String GET_SECOND_FRAGMENT = "get_second_fragment";

public static FirstFragment newInstance() {
    FirstFragment fragment = new FirstFragment();
    Bundle args = new Bundle();
    fragment.setArguments(args);
    return fragment;
}

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mMyItemList = new ArrayList<>();
}

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    mBinder = DataBindingUtil.inflate(inflater, R.layout.fragment_first, container, false);
    populate();
    mManager = new GridLayoutManager(getContext(), 3, GridLayoutManager.VERTICAL, false);
    mAdapter = new FirstAdapter(getContext(), mMyItemList);
    mBinder.rvFirst.setLayoutManager(mManager);
    mBinder.rvFirst.setAdapter(mAdapter);
    mAdapter.addOnItemInteractionListener(this);
    EventBus.getDefault().register(this);
    return mBinder.getRoot();
}

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
}

@Override
public void onDestroyView() {
    super.onDestroyView();
    EventBus.getDefault().unregister(this);
}

private void populate() {
    for (int i = 0; i < 30; i++) {
        mMyItemList.add(i, mMyItem);
    }
}

private void sendAction(String action, List<MyItem> myItemList, int position) {
    if (mListener == null) {
        return;
    }
    Bundle bundle = new Bundle();
    bundle.putString(Constants.ACTION, action);
    bundle.putParcelable(Constants.DATA1, Parcels.wrap(myItemList));
    bundle.putInt(Constants.POSITION, position);
    mListener.onFragmentInteraction(bundle);
}

@Override
public void onItemClick(int position) {
    sendAction(GET_SECOND_FRAGMENT, mMyItemList, position);
}

@Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
public void onMessage(SendPos event) {
    mPosition = event.getPos();
    mBinder.rvFirst.scrollToPosition(mPosition);
    mBinder.rvFirst.getLayoutManager().scrollToPosition(mPosition);
    EventBus.getDefault().removeStickyEvent(event);
}

}

第二个片段

public class SecondFragment extends BaseFragment {

FragmentSecondBinding mBinder;
List<MyItem> mMyItemList;
LinearLayoutManager mManager;
Parcelable mParcelable;
SecondAdapter mAdapter;
int mPosition;

private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
public static final String ACTION_BACK = "back";

public static SecondFragment newInstance(List<MyItem> myItemList, int position) {
    SecondFragment fragment = new SecondFragment();
    Bundle args = new Bundle();
    args.putParcelable(ARG_PARAM1, Parcels.wrap(myItemList));
    args.putInt(ARG_PARAM2, position);
    fragment.setArguments(args);
    return fragment;
}

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getArguments() != null) {
        mParcelable = getArguments().getParcelable(ARG_PARAM1);
        mMyItemList = Parcels.unwrap(mParcelable);
        mPosition = getArguments().getInt(ARG_PARAM2);
    }
}

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    mBinder = DataBindingUtil.inflate(inflater, R.layout.fragment_second, container, false);
    mManager = new LinearLayoutManager(getContext());
    mAdapter = new SecondAdapter(getContext(), mMyItemList);
    mBinder.rvSecond.setLayoutManager(mManager);
    mBinder.rvSecond.setAdapter(mAdapter);
    mManager.scrollToPosition(mPosition);
    setUIListeners();
    return mBinder.getRoot();
}

private void setUIListeners() {
    mBinder.back.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mPosition = mManager.findFirstVisibleItemPosition();
            sendPos(mPosition);
            sendActionToActivity(ACTION_BACK);
        }
    });
}

private void sendActionToActivity(String action) {
    Bundle bundle = new Bundle();
    bundle.putString(Constants.ACTION, action);
    mListener.onFragmentInteraction(bundle);
}

private void sendPos(int pos) {
    SendPos sendPos = new SendPos();
    sendPos.setPos(pos);
    EventBus.getDefault().postSticky(sendPos);
}

}

【问题讨论】:

    标签: android android-recyclerview gridlayoutmanager linearlayoutmanager


    【解决方案1】:

    您是否也尝试过使用 RecyclerView ?例如:

    mRecyclerView.scrollToPosition(mPosition);
    mRecyclerView.getLayoutManager().scrollToPosition(mPosition);
    

    别忘了注册EventBusEventBus.getDefault().register(this);

    编辑:

    您可以改用 RecyclerView.smoothScrollToPosition(int position)

    希望这会有所帮助。 对不起我的英语。

    【讨论】:

    • 能否给你看一下这两个片段的完整代码?
    • 如果你得到 mPosition 的值,你有没有查看 onMessage() 方法,例如 Log ?
    • mRecyclerView.smoothScrollToPosition(mPosition);效果不好?
    • 它需要public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, int position)。如何获得State
    • 你可以直接使用smoothScrollToPosition()和RecyclerView。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-05
    • 1970-01-01
    相关资源
    最近更新 更多