滚动时在recyclelerview中加载更多数据

问题描述 投票:1回答:1

我在列表中获得了Json数据,其中包含100个项目。我将此列表传递给recyclerview适配器。但我想首先只传递10个项目。在用户滚动列表后10个项目之后,它应该从列表中加载更多数据。我已经实现了滚动侦听器和其他适配器。我不知道如何将10个项目从json列表传递给适配器。

滚动监听器

public abstract class PaginationScrollListener extends RecyclerView.OnScrollListener {

LinearLayoutManager layoutManager;

/**
 * Supporting only LinearLayoutManager for now.
 *
 * @param layoutManager
 */
public PaginationScrollListener(LinearLayoutManager layoutManager) {
    this.layoutManager = layoutManager;
}

@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
    super.onScrolled(recyclerView, dx, dy);

    int visibleItemCount = layoutManager.getChildCount();
    int totalItemCount = layoutManager.getItemCount();
    int firstVisibleItemPosition = layoutManager.findFirstVisibleItemPosition();

    if (!isLoading() && !isLastPage()) {
        if ((visibleItemCount + firstVisibleItemPosition) >= totalItemCount
                && firstVisibleItemPosition >= 0
                && totalItemCount >= getTotalPageCount()) {
            loadMoreItems();
        }
    }

}

protected abstract void loadMoreItems();

public abstract int getTotalPageCount();

public abstract boolean isLastPage();

public abstract boolean isLoading();

}

适配器

public class PaginationAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

private static final int ITEM = 0;
private static final int LOADING = 1;

private List<Movie> movies;
private Context context;

private boolean isLoadingAdded = false;

public PaginationAdapter(Context context) {
    this.context = context;
    movies = new ArrayList<>();
}

public List<Movie> getMovies() {
    return movies;
}

public void setMovies(List<Movie> movies) {
    this.movies = movies;
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    RecyclerView.ViewHolder viewHolder = null;
    LayoutInflater inflater = LayoutInflater.from(parent.getContext());

    switch (viewType) {
        case ITEM:
            viewHolder = getViewHolder(parent, inflater);
            break;
        case LOADING:
            View v2 = inflater.inflate(R.layout.item_progress, parent, false);
            viewHolder = new LoadingVH(v2);
            break;
    }
    return viewHolder;
}

@NonNull
private RecyclerView.ViewHolder getViewHolder(ViewGroup parent, LayoutInflater inflater) {
    RecyclerView.ViewHolder viewHolder;
    View v1 = inflater.inflate(R.layout.item_list, parent, false);
    viewHolder = new MovieVH(v1);
    return viewHolder;
}

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {

    Movie movie = movies.get(position);

    switch (getItemViewType(position)) {
        case ITEM:
            MovieVH movieVH = (MovieVH) holder;

            movieVH.textView.setText(movie.getTitle());
            break;
        case LOADING:

            break;
    }

}

@Override
public int getItemCount() {

    return movies == null ? 0 : movies.size();
}

@Override
public int getItemViewType(int position) {
    return (position == movies.size() - 1 && isLoadingAdded) ? LOADING : ITEM;
}



public void add(Movie mc) {
    movies.add(mc);
    notifyItemInserted(movies.size() - 1);
}

public void addAll(List<Movie> mcList) {
    for (Movie mc : mcList) {
        add(mc);
    }
}

public void remove(Movie city) {
    int position = movies.indexOf(city);
    if (position > -1) {
        movies.remove(position);
        notifyItemRemoved(position);
    }
}

public void clear() {
    isLoadingAdded = false;
    while (getItemCount() > 0) {
        remove(getItem(0));
    }
}

public boolean isEmpty() {
    return getItemCount() == 0;
}


public void addLoadingFooter() {
    isLoadingAdded = true;
    add(new Movie());
}

public void removeLoadingFooter() {
    isLoadingAdded = false;

    int position = movies.size() - 1;
    Movie item = getItem(position);

    if (item != null) {
        movies.remove(position);
        notifyItemRemoved(position);
    }
}

public Movie getItem(int position) {
    return movies.get(position);
}


    public MovieVH(View itemView) {
        super(itemView);

        textView = (TextView) itemView.findViewById(R.id.item_text);
    }
}


protected class LoadingVH extends RecyclerView.ViewHolder {

    public LoadingVH(View itemView) {
        super(itemView);
    }
}


}

**获得Api响应**

private void callApi() {
    apiInterfacePages = ApiClient.getRetrofit().create(APIInterface.class);
    Call<CamerasItem> camerasCall = apiInterfacePages.getCameras();
    camerasCall.enqueue(new Callback<CamerasItem>() {
        @Override
        public void onResponse(Call<CamerasItem> call, Response<CamerasItem> response) {

            CamerasItem camerasItem = response.body();
            itemList = new ArrayList<>();
            itemList = camerasItem.getItems();
            Log.i("Item", "" + getChannel().getName());

            for (int i = 0; i < itemList.size(); i++) {

                if (itemList.get(i).getCategory().equals(getChannel().getName())){
                    if (!itemList.get(i).getUrlMjpeg().endsWith("=mediaRedirect")) {
                        String videoUrl = itemList.get(i).getUrlMjpeg();
                        String imageUrl = itemList.get(i).getThumbnail();
                        String name = itemList.get(i).getName();
                        String city = itemList.get(i).getCity();
                        String flag = itemList.get(i).getFlag();
                        String country=  itemList.get(i).getCountry();
                        modelList.add(new MyModel(videoUrl, imageUrl, name, city, flag,country));
                    }

                }
        }

        @Override
        public void onFailure(Call<CamerasItem> call, Throwable t) {
            Log.i("Item", "" + t.getMessage());

        }
    });
}

那么现在如何第一次将10个项目传递给recyclerview,每个滚动传递10个项目。

android-recyclerview onscrolllistener loaddata
1个回答
0
投票

你必须在活动的xml中设置Progressbar,其中定义了Recyclerview。和loadThumbnail是一个下载缩略图的功能。它只是向下滚动一点延迟。现在,适配器类的完整代码如下所示

public class CamerasAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

private List<MyModel> list;
private Activity mActivity;
private static final int TYPE_VIDEO = 0, TYPE_ADD = 1;
private static final int PAGE_LIMIT = 5;
private int mCurrentLimit = PAGE_LIMIT;
private boolean mIsLoading;
RelativeLayout mLoaderProgress;

public CamerasAdapter(FragmentActivity activity, RelativeLayout loaderLayout) {
    mActivity = activity;
    mLoaderProgress = loaderLayout;
}

@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    View itemView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.li_web_cam_view, viewGroup, false);
    return new CamsViewHolder(itemView);
}

@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
    if (mCurrentLimit == (i + 1) && mCurrentLimit <= list.size() && !mIsLoading) {
        mLoaderProgress.setVisibility(View.VISIBLE);
        mIsLoading = true;
        loadThumbnail(0, i + 1);
    } else {
        //do nothing
    }
    ((CamsViewHolder) viewHolder).onBindData(mActivity, list.get(i), i);
    ((CamsViewHolder) viewHolder).emptyView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            itemClickListner.onClick(i, ((CamsViewHolder) viewHolder).tvCamName, list.get(i));
        }
    });
}

private void loadThumbnail(final int count, int position) {
    try {
        if (count > 2 || position >= list.size()) {
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    mIsLoading = false;
                    mCurrentLimit = mCurrentLimit + PAGE_LIMIT;
                    notifyItemChanged(position - count);
                    mLoaderProgress.setVisibility(View.GONE);
                    return;
                }
            }, 2000);

        } else {
            if (list.get(position) == null) {
                loadThumbnail(count, position + 1);
            } else {
                Glide.with(mActivity).load(list.get(position).getImage_url()).downloadOnly(new SimpleTarget<File>() {
                    @Override
                    public void onResourceReady(File resource, GlideAnimation<? super File> glideAnimation) {
                        loadThumbnail((count + 1), (position + 1));
                    }

                    @Override
                    public void onLoadFailed(Exception e, Drawable errorDrawable) {
                        loadThumbnail((count + 1), (position + 1));
                    }
                });
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
        mLoaderProgress.setVisibility(View.GONE);
        mIsLoading = false;
    }

}

@Override
public int getItemCount() {
    return mCurrentLimit <= list.size() ? mCurrentLimit : list.size();
}

public void setData(List<MyModel> dataList) {
    this.list = dataList;
    notifyDataSetChanged();
}

ItemClickListner itemClickListner;

public void setListener(ItemClickListner listener) {
    itemClickListner = listener;
}

ProgressLoadListener progressLoadListener;

public void setProgressLoadListener(ProgressLoadListener listener) {
    progressLoadListener = listener;
}

}

xml文件的代码

<android.support.v7.widget.RecyclerView
    android:id="@+id/recycler_view"
    android:layout_width="match_parent"
    android:visibility="gone"
    android:layout_height="match_parent"
    android:layout_above="@+id/loader_progress_bar_layout"
    android:background="#f5f5f5"
    android:layout_gravity="center" />

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:id="@+id/loader_progress_bar_layout"
    android:visibility="gone"
    android:background="#fff"
    >
    <ProgressBar
        android:id="@+id/progress_bar_loader"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_gravity="center" />

</RelativeLayout>

使用适配器初始化Recyclerview

public class Main2Activity extends AppCompatActivity {

RecyclerView recyclerView;
RelativeLayout layoutProgressBar;
CamerasAdapter adapter;
List<Item> itemList;
LinearLayoutManager mLayoutManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main2);
    layoutProgressBar = findViewById(R.id.loader_progress_bar_layout);
    recyclerView = findViewById(R.id.recycler_view);
    adapter = new CamerasAdapter(getActivity(), loaderLayout);
    mLayoutManager = new LinearLayoutManager(getActivity());
    recyclerView.setLayoutManager(mLayoutManager);
    recyclerView.setAdapter(adapter);

    adapter.setProgressLoadListener(new ProgressLoadListener() {
        @Override
        public void loadProgressBar() {
            layoutProgressBar.setVisibility(View.VISIBLE);
        }
    });
    adapter.setData(setAdaperData());

}

public List<MyModel> setAdaperData(){ 
    List<MyModel> modelList = new ArrayList<>();
    /*addItemsto list*/
    return modelList;

}
}
© www.soinside.com 2019 - 2024. All rights reserved.