Android RecycleView在加载数据时滚动到顶部

时间:2017-05-30 13:17:49

标签: android pagination android-recyclerview

我想在我的应用程序中使用Recycleview实现分页,我使用addOnScrollListener检查我是否到达最后一个单元格,如下所示。

数据加载没有任何问题,但当我滚动到最后一个单元格时,Recycleview将自动滚动回列表的顶部!并且toast消息(列表末尾)会持续弹出?

这是课程:

public class MainActivity extends AppCompatActivity {
    int pageno = 0;
    ArrayList<carobject> carslist = new ArrayList<>();
    RecyclerView RV;
    adapter listadapter;
    LinearLayoutManager layoutManager;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        RV = (RecyclerView) findViewById(R.id.mainrv);
        layoutManager = new LinearLayoutManager(this);
        RV.setLayoutManager(layoutManager);
       loaddata(pageno);
        RV.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                int visibleItemCount = layoutManager.getChildCount();
                int totalItemCount = layoutManager.getItemCount();
                int pastVisibleItems = layoutManager.findFirstVisibleItemPosition();
                if (pastVisibleItems + visibleItemCount >= totalItemCount) {
                    Toast.makeText(MainActivity.this, "end of list", Toast.LENGTH_SHORT).show();
                    pageno +=1;
                    loaddata(pageno);
                    RV.getAdapter().notifyDataSetChanged();
                }
            }
        });

    }
public void loaddata(final int pagetoloaad){
// load data from API using Volley........

listadapter = new adapter(MainActivity.this,carslist);
                            RV.setAdapter(listadapter);
    }

更新:

我已将以下代码移至创建方法

listadapter = new adapter(MainActivity.this,carslist);
RV.setAdapter(listadapter);

并将其替换为

RV.getAdapter().notifyDataSetChanged();

自动滚动到顶部问题已解决,但在滚动到按钮时我的应用程序崩溃

java.lang.NegativeArraySizeException: -652
at com.android.volley.toolbox.DiskBasedCache.streamToBytes(DiskBasedCache.java:323)
at com.android.volley.toolbox.DiskBasedCache.get(DiskBasedCache.java:119)
at com.android.volley.CacheDispatcher.run(CacheDispatcher.java:100)

非常感谢任何想法

3 个答案:

答案 0 :(得分:1)

listadapter = new adapter(MainActivity.this,carslist); RV.setAdapter(listadapter); loaddata(pageno)方法调用时,每次滚动recyclelerview并调用loaddata()方法时,都会创建适配器实例。

仅在'onCreate()'中实例化一次适配器。它会解决你的问题。

如果您仍需要任何帮助,请在评论中告诉我。

答案 1 :(得分:0)

试试这个解决方案

保存恢复你设置适配器时的状态

private Parcelable recyclerViewState;

public void loaddata(final int pagetoloaad){
// load data from API using Volley........

listadapter = new adapter(MainActivity.this,carslist);
                            RV.setAdapter(listadapter);
RV.getLayoutManager().onRestoreInstanceState(recyclerViewState);
    }

然后在调用加载数据时保存状态

recyclerViewState = RV.getLayoutManager().onSaveInstanceState();
pageno +=1;
                    loaddata(pageno);
                    RV.getAdapter().notifyDataSetChanged();

答案 2 :(得分:0)

使用Queue Singleton进行排球后,解决了public class Singleton extends Application { public static final String TAG = Singleton.class.getSimpleName(); private RequestQueue mRequestQueue; private static Singleton mInstance; @Override public void onCreate() { super.onCreate(); mInstance = this; } public static synchronized Singleton getInstance() { return mInstance; } public RequestQueue getRequestQueue() { if (mRequestQueue == null) { mRequestQueue = Volley.newRequestQueue(getApplicationContext()); } return mRequestQueue; } public <T> void addToRequestQueue(Request<T> req, String tag) { req.setTag(TextUtils.isEmpty(tag) ? TAG : tag); getRequestQueue().add(req); } } 的问题。

Singleton.getInstance().addToRequestQueue(stringRequest,"Your Tag");

用法:

.sweet-alert input

并且不要忘记将Singleton类添加到清单文件

希望能帮到某个人