2017-05-30 87 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類添加到您的清單文件

希望能幫到一些一