java - 如何使用两个列表对 recyclerview 进行分页
问题描述
我正在尝试使用来自 2 个 API 端点的多个列表(如 Facebook 广告和用户提要)设置 Recyclerview,但是当我尝试对列表进行分页(加载更多)时出现一些错误。
这是我的代码。从不同的 API 端点加载两个列表后,我尝试在我的活动中调用 addAll 方法,但出现错误(我也在我的 loadMore 侦听器 [paginate stuff] 中调用此方法)。
private static final int TYPE_VIDEO = 0;
private static final int TYPE_PROMOTED_VIDEO = 1;
private static final int TYPE_LOADING = 3;
private Context context;
List<Video> videosList;
List<Promoted> promotedVideosList;
private boolean isLoadingAdded = true;
public MyAdapter(Context context){
this.context = context;
//Initalization stuffs
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
RecyclerView.ViewHolder viewHolder = null;
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
switch (viewType) {
case TYPE_VIDEO:
View viewVideo = inflater.inflate(R.layout.item_video, parent, false);
viewHolder = new VideoVH(viewVideo);
break;
case TYPE_PROMOTED_VIDEO:
View viewPromoted = inflater.inflate(R.layout.item_promoted_video, parent, false);
viewHolder = new PromotedVH(viewPromoted);
break;
case TYPE_LOADING:
View viewLoading = inflater.inflate(R.layout.item_loading, parent, false);
viewHolder = new LoadingVH(viewLoading);
break;
}
return viewHolder;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
switch (getItemViewType(position)) {
case TYPE_VIDEO:
//DO something when it a normal video
break;
case TYPE_PROMOTED_VIDEO:
//DO something when it's a promoted video
break;
case TYPE_LOADING:
//Loading view
break;
}
}
public void add(Video video, Promoted promoted) {
Toast.makeText(context, "Not Null", Toast.LENGTH_SHORT).show();
videosList.add(video);
promotedVideosList.add(promoted);
notifyItemInserted(videosList.size() + promotedVideosList.size() - 1);
}
public void addAll(List<Video> videoList, List<Promoted> promotedList) {
add(addVideo(videoList), addPromoted(promotedList));
}
private Video addVideo(List<Video> videoList){
for (Video result : videoList) return result;
return null;
}
private Promoted addPromoted(List<Promoted> promotedList{
for (Promoted result : promotedList) return result;
return null;
}
@Override
public int getItemCount() {
return videosList == null && promotedVideosList == null ? 0 : this.videosList.size() + this.promotedVideosList.size();
}
@Override
public int getItemViewType(int position) {
int videoSize = this.videosList.size();
int promotedSize = this.promotedVideosList.size();
if(position < videoSize){
return TYPE_VIDEO;
}
if(position - videoSize < promotedSize){
return TYPE_PROMOTED_VIDEO;
}
if (position == promotedSize + videoSize - 1 && isLoadingAdded){
return TYPE_LOADING;
}
return -1;
}
public static class VideoVH extends RecyclerView.ViewHolder{
VideoVH(View itemView) {
super(itemView);
//findviewbyid stuff
}
}
public static class PromotedVH extends RecyclerView.ViewHolder{
public PromotedVH(View itemView) {
super(itemView);
//findviewbyid stuff
}
}
public static class LoadingVH extends RecyclerView.ViewHolder{
@BindView(R.id.loading_progress)
ProgressBar loading;
public LoadingVH(View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
}
}
我希望这能奏效,但不知何故它没有,我知道我做的不对。
这是我的 logcat 的一个片段。
java.lang.NullPointerException: Attempt to invoke interface method'boolean java.util.List.add(java.lang.Object)' on a null object reference
at com.myproject.adapters.MyAdapter.add(MyAdapter.java:508)
at com.myproject.adapters.MyAdapter.addAll(MyAdapter.java:515)
解决方案
在将数据添加到列表之前是否对其进行了初始化。在您的构造函数中,您必须初始化所有列表。例如:videoList = new List(); 同样地
推荐阅读
- python - 试图从 df 中获取一个值以用作指示轴中轴范围的值
- javascript - Javascript在转译前导入打字稿文件
- python - 如何将具有 MultiIndex 索引和具有字符串值的列的数据框转换为数据透视表?
- wordpress - WordPress 多个侧边栏不起作用
- java - Slick2D 奇怪的错误,Music(String ref, boolean streamingHint) 只工作一秒钟然后停止
- google-apps-script - 在 Appscript 上检测日期值的功能问题
- java - 在 REST API 调用之后,我有以下格式的键/值对,我只需要提取与键对应的特定值
- angular - 来自移动应用程序的 Laravel api 请求收到缺少令牌错误页面 (419)
- visual-studio-code - 如何打印 SASS 变量以进行调试
- wordpress - 如何使用 utm 参数从 url(page) 重定向到多个 url