我想在我的应用程序中使用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)
非常感谢任何想法
答案 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类添加到清单文件
希望能帮到某个人