添加项目后,RecyclerView滚动到顶部

时间:2020-02-19 08:18:18

标签: android android-recyclerview

我有一个RecyclerView,用于显示活动中的项目。当我滚动到底部时,我将进行另一个API调用以获取另一组数据。加载项目时,我的RecyclerView滚动到顶部。我尝试了其他未成功列出的解决方案。我已经尝试了许多类似的话题中提到的所有建议(如果不是全部的话)。他们都没有为我工作。

activity_see_more.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/see_more_frameLayout" />
</LinearLayout>

SeeMoreActivity.java 中,我从MvpView中覆盖以下方法

@Override
public void loadPropertiesForCategory(List<Property> propertyList) {
    Preferences sharedPref = new Preferences(this);
    if (!properties.containsAll(propertyList)) {
        properties.addAll(propertyList);
    }
    sharedPref.setFilterList(properties);
    ResultListFragment fragment = ResultListFragment.setTag("see_more_filter");
    getSupportFragmentManager().beginTransaction().add(R.id.see_more_frameLayout, fragment, "search").commit();
}

ResultListFragment.java

private void setListOfCategoryProperties() {
    page = 2;
    mSearchList = mPreferences.getFilterList();
    setListAdapter(false, false, View.VISIBLE, View.GONE, false);
    mResultRecycleView.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);
            LinearLayoutManager linearLayoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
            if (linearLayoutManager != null && linearLayoutManager.findLastVisibleItemPosition() == mSearchList.size() - 1) {
                ((SeeMoreActivity) getActivity()).setLoadPropertiesParamsAndCallApi(page);
                if (mSearchList.size() != mPreferences.getFilterList().size()) {
                    page++;
                    mSearchList = mPreferences.getFilterList();
                    //mAdapter.notifyDataSetChanged();
                    mAdapter.notifyItemInserted(mSearchList.size() - 1);
                }
            }
        }
    });
}

public void listAdapter() {
    mResultRecycleView.setLayoutManager(new LinearLayoutManager(getContext()));
    mResultRecycleView.setItemAnimator(new DefaultItemAnimator());
    mResultRecycleView.setNestedScrollingEnabled(true);
    mResultRecycleView.setAdapter(mAdapter);
}

private void setListAdapter(boolean showDeleteButton, boolean changeVisibility, int showNoResult, int showNoSavedSearch, boolean reverseFavorite) {
        if (mSearchList != null && mSearchList.size() != 0) {
            if (changeVisibility) {
                setVisibility(View.VISIBLE, View.GONE, View.GONE);
            }
            mAdapter = new SearchListAdapter(R.layout.item_single_element, mSearchList, showDeleteButton, this, reverseFavorite);
            listAdapter();
        } else {
            setVisibility(View.GONE, showNoSavedSearch, showNoResult);
        }
    }

public void handleTags() {
        switch (mTag) {
            case "result_search":
                setListAdapterForHomeSearch();
                break;
            case "see_more_filter":
                setListOfCategoryProperties();
                break;
            case Constants.USER_FAVORITES_KEY:
                setListOfUserFavoriteProperties();
                break;
        }
    }

2 个答案:

答案 0 :(得分:0)

很难说,但是好像您每次收到更多数据时都将适配器重新设置为新适配器。这会重置RecyclerView中的一堆内部状态,所以可能是造成这种情况的原因。

要解决此问题,您应该保留现有适配器,而调用Adapter.notify...方法之一(可能是notifyItemRangeInserted)来通知适配器已添加更多数据。您还可以使用ListAdapter及其submitList方法自动为您处理。

答案 1 :(得分:0)

问题是,每当我进行API调用时,我都在创建片段的新实例。现在,我仅创建一个实例并通过向其添加新元素来更新列表,一切正常。

相关问题