firebase - 请解决此运行时错误,当我向下滚动或选择其他类别时,我的应用程序崩溃了
问题描述
请帮助我解决此运行时错误,当我向下滚动或在导航栏中选择其他类别时,我的应用程序崩溃了。
我的预期结果是,当我点击导航栏类别时,我会进入该页面,或者当我向下滚动时,我可以滚动它,但实际出现在我面前的结果是,当我点击导航内容或向下滚动时应用程序崩溃。
这是我要分享的 HomePageAdapter.java 下面给出的代码。
package com.example.mymall;
import android.content.Intent;
import android.graphics.Color;
import android.os.Handler;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.gridlayout.widget.GridLayout;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.viewpager.widget.ViewPager;
import org.w3c.dom.Text;
import java.util.ArrayList;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
public class HomePageAdapter extends RecyclerView.Adapter {
private List<HomePageModel> homePageModelList;
private RecyclerView.RecycledViewPool recycledViewPool ;
public HomePageAdapter(List<HomePageModel> homePageModelList) {
this.homePageModelList = homePageModelList;
recycledViewPool = new RecyclerView.RecycledViewPool();
}
@Override
public int getItemViewType(int position) {
switch (homePageModelList.get(position).getType()) {
case 0:
return HomePageModel.BANNER_SLIDER;
case 1:
return HomePageModel.STRIP_AD_BANNER ;
case 2:
return HomePageModel.HORIZONTAL_PRODUCT_VIEW ;
case 3:
return HomePageModel.GRID_PRODUCT_VIEW ;
default:
return -1;
}
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {
switch (viewType) {
case HomePageModel.BANNER_SLIDER:
View BannerSliderView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.sliding_ad_layout, viewGroup, false);
return new BannerSliderViewholder(BannerSliderView);
case HomePageModel.STRIP_AD_BANNER:
View stripAdView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.strip_ad_layout, viewGroup, false);
return new StripAdBannerViewholder(stripAdView);
case HomePageModel.HORIZONTAL_PRODUCT_VIEW:
View horizontalProductView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.horizontal_scroll_layout, viewGroup, false);
return new horizontalProductViewHolder(horizontalProductView);
case HomePageModel.GRID_PRODUCT_VIEW:
View gridProductView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.grid_product_layout, viewGroup, false);
return new GridProductViewHolder(gridProductView);
default:
return null;
}
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) {
switch (homePageModelList.get(position).getType()){
case HomePageModel.BANNER_SLIDER:
List<SliderModel> sliderModelList = homePageModelList.get(position).getSliderModelList();
((BannerSliderViewholder)viewHolder).setBannerSliderViewPager(sliderModelList);
break;
case HomePageModel.STRIP_AD_BANNER:
int resource = homePageModelList.get(position).getResource();
String color = homePageModelList.get(position).getBackgroundColor();
((StripAdBannerViewholder)viewHolder).setStripAd(resource,color);
break;
case HomePageModel.HORIZONTAL_PRODUCT_VIEW:
String horizontalLayoutTitle = homePageModelList.get(position).getTitle();
List<HorizontalProductScrollModel> horizontalProductScrollModelList = homePageModelList.get(position).getHorizontalProductScrollModelList();
((horizontalProductViewHolder)viewHolder).setHorizontalProductLayout(horizontalProductScrollModelList,horizontalLayoutTitle);
break;
case HomePageModel.GRID_PRODUCT_VIEW:
String gridLayoutTitle = homePageModelList.get(position).getTitle();
List<HorizontalProductScrollModel> gridProductScrollModelList = homePageModelList.get(position).getHorizontalProductScrollModelList();
((GridProductViewHolder)viewHolder).setGridProductLayout(gridProductScrollModelList,gridLayoutTitle);
default:
return;
}
}
@Override
public int getItemCount() {
return homePageModelList.size();
}
public class BannerSliderViewholder extends RecyclerView.ViewHolder {
private ViewPager bannerSliderViewPager;
private int currentPage ;
private Timer timer;
final private long DELAY_TIME = 3000;
final private long PERIOD_TIME = 3000;
private List<SliderModel> arrangedList ;
public BannerSliderViewholder(@NonNull View itemView) {
super(itemView);
bannerSliderViewPager = itemView.findViewById(R.id.banner_slider_view_pager);
}
private void setBannerSliderViewPager(final List<SliderModel> sliderModelList){
currentPage = 2 ;
if(timer != null){
timer.cancel();
}
arrangedList = new ArrayList<>() ;
for(int x = 0; x < sliderModelList.size(); x++){
arrangedList.add(x,sliderModelList.get(x));
}
arrangedList.add(0,sliderModelList.get(sliderModelList.size() -2));
arrangedList.add(1,sliderModelList.get(sliderModelList.size() - 1));
arrangedList.add(sliderModelList.get(0));
arrangedList.add(sliderModelList.get(1));
SliderAdapter sliderAdapter = new SliderAdapter(arrangedList);
bannerSliderViewPager.setAdapter(sliderAdapter);
bannerSliderViewPager.setClipToPadding(false);
bannerSliderViewPager.setPageMargin(20);
bannerSliderViewPager.setCurrentItem(currentPage);
ViewPager.OnPageChangeListener onPageChangeListener = new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int i, float v, int i1) {
}
@Override
public void onPageSelected(int i) {
currentPage = i ;
}
@Override
public void onPageScrollStateChanged(int i) {
if (i == ViewPager.SCROLL_STATE_IDLE){
pageLooper(arrangedList);
}
}
};
bannerSliderViewPager.addOnPageChangeListener(onPageChangeListener);
startBannerSlideShow(arrangedList);
bannerSliderViewPager.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
pageLooper(arrangedList);
stopBannerSlideshow();
if (event.getAction() == MotionEvent.ACTION_UP){
startBannerSlideShow(arrangedList);
}
return false;
}
});
}
private void pageLooper(List<SliderModel> sliderModelList){
if (currentPage == sliderModelList.size() - 2){
currentPage = 2;
bannerSliderViewPager.setCurrentItem(currentPage,false);
}
if (currentPage == 1){
currentPage = sliderModelList.size() - 3 ;
bannerSliderViewPager.setCurrentItem(currentPage,false);
}
}
private void startBannerSlideShow(List<SliderModel> sliderModelList){
Handler handler = new Handler();
Runnable update = new Runnable() {
@Override
public void run() {
if (currentPage >= sliderModelList.size()){
currentPage = 1 ;
}
bannerSliderViewPager.setCurrentItem(currentPage++,true);
}
};
timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
handler.post(update);
}
},DELAY_TIME,PERIOD_TIME);
}
private void stopBannerSlideshow(){
timer.cancel();
}
}
public class StripAdBannerViewholder extends RecyclerView.ViewHolder{
private ImageView stripAdImage ;
private ConstraintLayout stripAdContainer ;
public StripAdBannerViewholder(@NonNull View itemView) {
super(itemView);
stripAdContainer = itemView.findViewById(R.id.strip_ad_container);
stripAdImage = itemView.findViewById(R.id.strip_ad_image);
}
private void setStripAd(int resource, String color){
stripAdImage.setImageResource(resource);
stripAdContainer.setBackgroundColor(Color.parseColor(color));
}
}
public class horizontalProductViewHolder extends RecyclerView.ViewHolder {
private TextView horizontalLayoutTitle ;
private Button horizontalViewAllBtn ;
private RecyclerView horizontalRecyclerView ;
public horizontalProductViewHolder(@NonNull View itemView) {
super(itemView);
horizontalLayoutTitle = itemView.findViewById(R.id.horizontal_scroll_layout_title);
horizontalViewAllBtn = itemView.findViewById(R.id.horizontal_scroll_view_all_layout_btn);
horizontalRecyclerView = itemView.findViewById(R.id.horizontal_scroll_layout_recyclerview);
horizontalRecyclerView.setRecycledViewPool(recycledViewPool);
}
private void setHorizontalProductLayout(List<HorizontalProductScrollModel> horizontalProductScrollModelList, String title){
horizontalLayoutTitle.setText(title);
if (horizontalProductScrollModelList.size() > 8 ) {
horizontalViewAllBtn.setVisibility(View.VISIBLE);
horizontalViewAllBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent viewAllIntent = new Intent(itemView.getContext(),ViewAllActivity.class);
viewAllIntent.putExtra("layout_code",0);
itemView.getContext().startActivity(viewAllIntent);
}
});
}
else {
horizontalViewAllBtn.setVisibility(View.INVISIBLE);
}
HorizontalProductScrollAdapter horizontalProductScrollAdapter = new HorizontalProductScrollAdapter(horizontalProductScrollModelList);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(itemView.getContext());
linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
horizontalRecyclerView.setLayoutManager(linearLayoutManager);
horizontalRecyclerView.setAdapter(horizontalProductScrollAdapter);
horizontalProductScrollAdapter.notifyDataSetChanged();
}
}
public class GridProductViewHolder extends RecyclerView.ViewHolder{
private TextView gridLayoutTitle ;
private Button gridLayoutViewAllBtn ;
private GridLayout gridProductLayout ;
public GridProductViewHolder(@NonNull View itemView) {
super(itemView);
gridLayoutTitle = itemView.findViewById(R.id.grid_product_layout_title);
gridLayoutViewAllBtn = itemView.findViewById(R.id.grid_product_layout_viewall_btn);
gridProductLayout = itemView.findViewById(R.id.grid_view);
}
private void setGridProductLayout(List<HorizontalProductScrollModel> horizontalProductScrollModelList,String title){
gridLayoutTitle.setText(title);
for (int x = 0; x < 4 ; x++)
{
ImageView hsproductImage = gridProductLayout.getChildAt(x).findViewById(R.id.h_s_product_image);
TextView hsproductTitle = gridProductLayout.getChildAt(x).findViewById(R.id.h_s_product_title);
TextView hsproductDescription = gridProductLayout.getChildAt(x).findViewById(R.id.h_s_product_description);
TextView hsproductPrice = gridProductLayout.getChildAt(x).findViewById(R.id.h_s_product_price);
hsproductImage.setImageResource(horizontalProductScrollModelList.get(x).getProductImage());
hsproductTitle.setText(horizontalProductScrollModelList.get(x).getProductTitle());
hsproductDescription.setText(horizontalProductScrollModelList.get(x).getProductDescription());
hsproductPrice.setText(horizontalProductScrollModelList.get(x).getProductPrice());
gridProductLayout.getChildAt(x).setBackgroundColor(Color.parseColor("#ffffff"));
gridProductLayout.getChildAt(x).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent productDetailsIntent = new Intent(itemView.getContext(),ProductDetailsActivity.class);
itemView.getContext().startActivity(productDetailsIntent);
}
});
}
gridLayoutViewAllBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent viewAllIntent = new Intent(itemView.getContext(),ViewAllActivity.class);
viewAllIntent.putExtra("layout_code",1);
itemView.getContext().startActivity(viewAllIntent);
}
});
}
}
}
这是一个显示的 Logcat 错误。
V/FA: onActivityCreated
V/FA: Activity resumed, time: 3642618
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.mrknc, PID: 8595
java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View androidx.gridlayout.widget.GridLayout.getChildAt(int)' on a null object reference
at com.example.mrknc.HomePageAdapter$GridProductViewHolder.setGridProductLayout(HomePageAdapter.java:319)
at com.example.mrknc.HomePageAdapter$GridProductViewHolder.access$300(HomePageAdapter.java:301)
at com.example.mrknc.HomePageAdapter.onBindViewHolder(HomePageAdapter.java:109)
at androidx.recyclerview.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:7065)
at androidx.recyclerview.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:7107)
at androidx.recyclerview.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:6012)
at androidx.recyclerview.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6279)
at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6118)
at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6114)
at androidx.recyclerview.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2303)
at androidx.recyclerview.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1627)
at androidx.recyclerview.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1587)
at androidx.recyclerview.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:665)
at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:4134)
at androidx.recyclerview.widget.RecyclerView.dispatchLayout(RecyclerView.java:3851)
at androidx.recyclerview.widget.RecyclerView.onLayout(RecyclerView.java:4404)
at android.view.View.layout(View.java:19590)
at android.view.ViewGroup.layout(ViewGroup.java:6053)
at androidx.constraintlayout.widget.ConstraintLayout.onLayout(ConstraintLayout.java:1855)
at android.view.View.layout(View.java:19590)
at android.view.ViewGroup.layout(ViewGroup.java:6053)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
at android.view.View.layout(View.java:19590)
at android.view.ViewGroup.layout(ViewGroup.java:6053)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1791)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1635)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1544)
at android.view.View.layout(View.java:19590)
at android.view.ViewGroup.layout(ViewGroup.java:6053)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
at android.view.View.layout(View.java:19590)
at android.view.ViewGroup.layout(ViewGroup.java:6053)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1791)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1635)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1544)
at android.view.View.layout(View.java:19590)
at android.view.ViewGroup.layout(ViewGroup.java:6053)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
at com.android.internal.policy.DecorView.onLayout(DecorView.java:758)
at android.view.View.layout(View.java:19590)
at android.view.ViewGroup.layout(ViewGroup.java:6053)
at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2484)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2200)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1386)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6733)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:911)
at android.view.Choreographer.doCallbacks(Choreographer.java:723)
at android.view.Choreographer.doFrame(Choreographer.java:658)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:897)
E/AndroidRuntime: at android.os.Handler.handleCallback(Handler.java:789)
at android.os.Handler.dispatchMessage(Handler.java:98)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6541)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
预先感谢您帮助我。
解决方案
推荐阅读
- python - 计算数据框列中列表的所有排列
- python - Python函数返回值与打印
- java - 如何找到字符串中两个字谜之间的距离
- asp.net-core-mvc - 您如何访问 IdentityUser 以更改其角色?
- git - 父分支合并到上游后从子分支提交拉取请求
- python-3.x - ValueError:检查目标时出错:预期的预测有 4 个维度,但得到了形状为 (256, 1, 1) 的数组
- reactjs - VSCode React-Native 在需要导入时没有下划线
- windows - 如何找到 USB 连接设备的文件系统路径?
- node.js - Lighthouse 返回错误:nginx 反向代理上的 NO_FCP
- python - 如何只分析图像的一部分?