2017-05-30 83 views
1

我想使用Recycleview在我的应用中实现分页,我使用addOnScrollListener来检查我是否到达最后一个单元格,如下所示。Android RecycleView加载数据时滚动到顶部

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

这是类:

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

UPDATE:

我在下面的代码移除,以上创建方法

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

并将其替换为

RV.getAdapter().notifyDataSetChanged(); 

自动滚动到顶部的问题就解决了,但我发现应用程序崩溃时保持滚动BUTTOM

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) 

任何想法,将不胜感激

+0

你上哪儿去调用方法“setAdapter( )'? –

+0

反序列化JSON对象后的loaddata函数 'listadapter = new adapter(MainActivity.this,carslist); RV.setAdapter(listadapter); ' –

+0

好的,你是否用'滚动'的问题? 'NegativeArraySizeException'是别的,你可能在webservice调用后得到这个。 这可能会帮助你:https://stackoverflow.com/questions/26290804/negativearraysizeexception-in-cachedispatcher-java99 –

回答

0

尝试这种解决方案

保存恢复状态当u盘适配器

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(); 
+0

你能检查我的更新吗 –

+0

好吧让我检查 –

1

由于listadapter = new adapter(MainActivity.this,carslist); RV.setAdapter(listadapter);loaddata(您做生意)方法,适配器例如每次当您滚动recyclerview并调用loaddata()方法调用得到建立。

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

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

+0

感谢您的回放,但我已经做了你提到的和崩溃问题现在提出,请检查更新 –

0

java.lang.NegativeArraySizeException: -652的问题在排队使用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"); 

而且不要忘记将Singleton类添加到您的清单文件

希望能帮到一些一