2017-05-30 4 views
1

Ich möchte die Seitenumbruch in meiner App mit Recycelview implementieren, ich habe die addOnScrollListener verwendet, um zu überprüfen, ob ich zur letzten Zelle wie unten gezeigt.Android RecycleView Scrollt nach oben, wenn es Daten lädt

Die Daten werden ohne irgendein Problem geladen, aber wenn ich zur letzten Zelle scrolle, scrollt der Recycleview automatisch zurück zum Anfang der Liste! und die Toast-Nachricht (Ende der Liste) Popup kontinuierlich halten?

Das ist die Klasse:

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:

ich unten Code entfernt haben sich auf Verfahren es

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

und ersetzen mit

RV.getAdapter().notifyDataSetChanged(); 
zu erstellen

Die automatische Scroll to top Problem ist gelöst, aber ich bin app Absturz immer beim Scrollen halten

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) 

Irgendwelche Ideen viel

+0

zu helfen

Hoffnung hinzufügen Wo Sie die Methode ‚setAdapter genannt haben () '?? –

+0

In loaddata-Funktion nach Deserialisierung der JSON-Objekte 'listadapter = neuer Adapter (MainActivity.this, carslist); RV.setAdapter (Listenadapter); ' –

+0

ok, bist du fertig mit 'scroll' Problem? "NegativeArraySizeException" ist etwas anderes, wahrscheinlich erhalten Sie dies nach Webservice-Aufruf. dies kann Ihnen helfen: https://stackoverflow.com/questions/26290804/negativearraysizeexception-in-cachedispatcher-java99 –

Antwort

0

geschätzt werden, um diese Lösung Versuchen

speichern Wiederherstellung der Staat würde auf Buttom wenn u gesetzt Adapter

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

und dann den Zustand speichern, wenn Sie laden von Daten rufen

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

könntest du mein Update überprüfen –

+0

okay lass mich überprüfen –

1

Wie listadapter = new adapter(MainActivity.this,carslist); RV.setAdapter(listadapter); ruft aus Loaddata (pageno) Methode, Instanz Adapter jedes Mal erstellt wird, wenn Sie recyclerview blättern und Loaddata() -Methode nennen.

Instantiieren Sie den Adapter also nur einmal in 'onCreate()'. Es wird dein Problem lösen.

Lassen Sie mich in dem Kommentar wissen, wenn Sie noch Hilfe benötigen.

+0

danke für deine Wiederholung, aber ich habe bereits getan, was Sie erwähnt und das Crash-Problem ausgelöst jetzt plz überprüfen Sie das Update –

0

Die Ausgabe des wird gelöst, nachdem der Queue Singleton für Volley verwendet wurde.

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

Verbrauch:

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

Und vergessen Sie nicht die Singleton Klasse Ihrer Manifest-Datei einige ein

Verwandte Themen