快速滚动列表视图自动分页失败
Auto pagination fails on fast scroll listView
我正在使用 Holder
创建 ListView
当我慢慢滚动时,一切都很好,Endless ListView
效果很好,但是当我打开页面并快速滚动到列表末尾时 ListView
无法进一步滚动在 Logcat 没有任何错误。
这是我的适配器 class getView
方法
@Override
public View getView(final int i, View view, ViewGroup viewGroup) {
View row=view;
Holder holder=null;
if(row==null){
LayoutInflater inflater= (LayoutInflater)mContext.getSystemService(mContext.LAYOUT_INFLATER_SERVICE);
row= inflater.inflate(R.layout.half_movie,viewGroup,false);
holder=new Holder(row);
row.setTag(holder);
}else{
holder= (Holder) row.getTag();
}
//here setting all holers
Picasso.with(mContext).load("https://image.tmdb.org/t/p/w185"+temp.getImageUrl()).into(holder.poster);
if(reachedEndOfList(i)) loadMoreData();
return row;
}
private boolean reachedEndOfList(int position) {
// can check if close or exactly at the end
return position == list.size() - 4;
}
private void loadMoreData() {
if(isNetworkAvailable()) {
new MyAdapter.AsyncTaskParseJson().execute(url);
}else{
Toast.makeText(mContext, "Sorry No internet Connection Found!", Toast.LENGTH_SHORT).show();
}
}
public class AsyncTaskParseJson extends AsyncTask<String,String ,void> {
JSONArray dataJsonArr = null;
ProgressDialog progressDialog;
@Override
protected void onPreExecute() {
progressDialog = ProgressDialog.show(mContext,
"Movie Pal!",
"Loading Movies List..");
}
@Override
protected void doInBackground(String... arg0) {
String yourJsonStringUrl = arg0[0];
yourJsonStringUrl=yourJsonStringUrl+"&page="+pageNmber;
JSONParser jParser = new JSONParser();
JSONObject json = jParser.getJSONFromUrl(yourJsonStringUrl.replace(" ","%20"));
System.out.println(json);
try {
JSONArray jsonArray = json.getJSONArray("results");
for (int i=0; i<jsonArray.length(); i++) {
Movie newMovie = new Movie();
//setting to class object
list.add(newMovie);
}
pageNmber++;} catch (JSONException e) {
e.printStackTrace();
}
return json;
}
@Override
protected void onPostExecute() {
progressDialog.dismiss();
}
}
我不知道我在这里遗漏了什么请帮忙!
您需要在加载新数据时调用 notifyDataSetChanged(或类似于 notifyDataSetInsert 的函数),以便它知道存在更多数据并且应该允许更多滚动。
此外,您可能没有在列表末尾和获取更多数据之间添加足够的填充(仅 4 个项目)。这可能会导致滚动卡顿 - 您将到达终点并停止,直到下载更多数据,然后您可以再次滚动。举个例子——我在结束前开始获取新数据 10 项,我只是访问本地数据库,而不是远程服务器。
我正在使用 Holder
创建 ListView
当我慢慢滚动时,一切都很好,Endless ListView
效果很好,但是当我打开页面并快速滚动到列表末尾时 ListView
无法进一步滚动在 Logcat 没有任何错误。
这是我的适配器 class getView
方法
@Override
public View getView(final int i, View view, ViewGroup viewGroup) {
View row=view;
Holder holder=null;
if(row==null){
LayoutInflater inflater= (LayoutInflater)mContext.getSystemService(mContext.LAYOUT_INFLATER_SERVICE);
row= inflater.inflate(R.layout.half_movie,viewGroup,false);
holder=new Holder(row);
row.setTag(holder);
}else{
holder= (Holder) row.getTag();
}
//here setting all holers
Picasso.with(mContext).load("https://image.tmdb.org/t/p/w185"+temp.getImageUrl()).into(holder.poster);
if(reachedEndOfList(i)) loadMoreData();
return row;
}
private boolean reachedEndOfList(int position) {
// can check if close or exactly at the end
return position == list.size() - 4;
}
private void loadMoreData() {
if(isNetworkAvailable()) {
new MyAdapter.AsyncTaskParseJson().execute(url);
}else{
Toast.makeText(mContext, "Sorry No internet Connection Found!", Toast.LENGTH_SHORT).show();
}
}
public class AsyncTaskParseJson extends AsyncTask<String,String ,void> {
JSONArray dataJsonArr = null;
ProgressDialog progressDialog;
@Override
protected void onPreExecute() {
progressDialog = ProgressDialog.show(mContext,
"Movie Pal!",
"Loading Movies List..");
}
@Override
protected void doInBackground(String... arg0) {
String yourJsonStringUrl = arg0[0];
yourJsonStringUrl=yourJsonStringUrl+"&page="+pageNmber;
JSONParser jParser = new JSONParser();
JSONObject json = jParser.getJSONFromUrl(yourJsonStringUrl.replace(" ","%20"));
System.out.println(json);
try {
JSONArray jsonArray = json.getJSONArray("results");
for (int i=0; i<jsonArray.length(); i++) {
Movie newMovie = new Movie();
//setting to class object
list.add(newMovie);
}
pageNmber++;} catch (JSONException e) {
e.printStackTrace();
}
return json;
}
@Override
protected void onPostExecute() {
progressDialog.dismiss();
}
}
我不知道我在这里遗漏了什么请帮忙!
您需要在加载新数据时调用 notifyDataSetChanged(或类似于 notifyDataSetInsert 的函数),以便它知道存在更多数据并且应该允许更多滚动。
此外,您可能没有在列表末尾和获取更多数据之间添加足够的填充(仅 4 个项目)。这可能会导致滚动卡顿 - 您将到达终点并停止,直到下载更多数据,然后您可以再次滚动。举个例子——我在结束前开始获取新数据 10 项,我只是访问本地数据库,而不是远程服务器。