Java RecycleServiceAdapter中的空指针异常
适配器工作正常,直到我决定添加本机广告,为此我在适配器中做了6次更改Java RecycleServiceAdapter中的空指针异常,java,android,nullpointerexception,android-adapter,Java,Android,Nullpointerexception,Android Adapter,适配器工作正常,直到我决定添加本机广告,为此我在适配器中做了6次更改 添加了新的视图类型(AD_视图_类型) 添加了新的ViewHolder(NativeExpressAdViewHolder) 更改了getItemViewType(使其每8个位置返回AD_视图_类型) 在onCreateViewHolder中添加了一个新案例 switch (viewType){ case AD_VIEW_TYPE: View nativeExpressLayoutV
switch (viewType){
case AD_VIEW_TYPE:
View nativeExpressLayoutView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.native_express_ad_container, parent, false);
return new NativeExpressAdViewHolder(nativeExpressLayoutView);
switch (viewType){
case AD_VIEW_TYPE:
NativeExpressAdViewHolder nativeExpressHolder = (NativeExpressAdViewHolder)holder;
NativeExpressAdView adView = (NativeExpressAdView)arrayList.get(position);
ViewGroup adCardView = (ViewGroup)nativeExpressHolder.itemView;
adCardView.removeAllViews();
if(adView.getParent() != null){
((ViewGroup)adView.getParent()).removeView(adView);
}
adCardView.addView(adView);
break;
switch (viewType){
case AD_VIEW_TYPE:
View nativeExpressLayoutView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.native_express_ad_container, parent, false);
return new NativeExpressAdViewHolder(nativeExpressLayoutView);
switch (viewType){
case AD_VIEW_TYPE:
NativeExpressAdViewHolder nativeExpressHolder = (NativeExpressAdViewHolder)holder;
NativeExpressAdView adView = (NativeExpressAdView)arrayList.get(position);
ViewGroup adCardView = (ViewGroup)nativeExpressHolder.itemView;
adCardView.removeAllViews();
if(adView.getParent() != null){
((ViewGroup)adView.getParent()).removeView(adView);
}
adCardView.addView(adView);
break;
ArrayList
更改为ArrayList
NullPointerException
logcat说
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.View.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
at com.company.appname.adapters.RecyclerViewAdapter$RecyclerViewHolder.<init>(RecyclerViewAdapter.java:186)
at com.company.appname.adapters.RecyclerViewAdapter$RecyclerViewHolder.<init>(RecyclerViewAdapter.java:165)
at com.company.appname.adapters.RecyclerViewAdapter$NativeExpressAdViewHolder.<init>(RecyclerViewAdapter.java:150)
at com.company.appname.adapters.RecyclerViewAdapter.onCreateViewHolder(RecyclerViewAdapter.java:84)
at com.company.appname.adapters.RecyclerViewAdapter.onCreateViewHolder(RecyclerViewAdapter.java:48)
java.lang.NullPointerException:尝试对空对象引用调用虚拟方法“void android.view.view.setOnClickListener(android.view.view$OnClickListener)”
位于com.company.appname.adapters.RecycleServiceAdapter$RecycleServiceWholder。(RecycleServiceAdapter.java:186)
位于com.company.appname.adapters.RecycleServiceAdapter$RecycleServiceWholder。(RecycleServiceAdapter.java:165)
位于com.company.appname.adapters.RecycleServiceAdapter$NativeExpressAdViewHolder。(RecycleServiceAdapter.java:150)
位于com.company.appname.adapters.RecycleServiceAdapter.onCreateViewHolder(RecycleServiceAdapter.java:84)
位于com.company.appname.adapters.RecycleServiceAdapter.onCreateViewHolder(RecycleServiceAdapter.java:48)
这些是我的代码中logcat指向的部分
/*Line 48*/public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.RecyclerViewHolder> {
public RecyclerViewAdapter(Context context, ArrayList<Object> arrayList, ArrayList<String> favouriteItemList, int totalCount {...}
@Override
public long getItemId(int position){...}
@Override
public RecyclerViewAdapter.RecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
switch (viewType){
case AD_VIEW_TYPE:
View nativeExpressLayoutView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.native_express_ad_container, parent, false);
/*Line 84*/ return new NativeExpressAdViewHolder(nativeExpressLayoutView);
case MENU_ITEM_VIEW_TYPE:
default:
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.cards, parent, false);
return new RecyclerViewHolder(view);
}
}
@Override
public void onBindViewHolder(final RecyclerViewHolder holder, final int position){...}
public class NativeExpressAdViewHolder extends RecyclerViewHolder{
NativeExpressAdViewHolder(View view){
/*Line 150*/ super(view);
}
}
@Override
public int getItemViewType(int position){...}
@Override
public int getItemCount(){...}
/*Line 165*/ public class RecyclerViewHolder extends RecyclerView.ViewHolder {
TextView title;
RelativeLayout relativeLayout;
RelativeLayout cardDescription;
SimpleDraweeView image;
ImageView favourite_button;
CardSetterGetter cardSetterGetter;
ImageView share;
private RecyclerViewHolder(View itemView) {
super(itemView);
title = (TextView) itemView.findViewById(R.id.image_title);
relativeLayout = (RelativeLayout) itemView.findViewById(R.id.activity_dash_board);
cardDescription = (RelativeLayout) itemView.findViewById(R.id.card_details);
image = (SimpleDraweeView) itemView.findViewById(R.id.image);
favourite_button = (ImageView) itemView.findViewById(R.id.favourite_button);
share = (ImageView) itemView.findViewById(R.id.share);
/*Line 186*/ image.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Activity activity = (Activity) context;
saveInfo(constants.SERVERIP.concat(cardSetterGetter.getImageurl()), cardSetterGetter.getImageId(), cardSetterGetter.getDescription(), cardSetterGetter.getImagetitle(), cardSetterGetter.getFavourite());
Intent i = new Intent().setClass(context, DetailsImageviewActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
context.startActivity(i);
activity.overridePendingTransition(R.anim.pull_from_right, R.anim.pull_out_to_right);
}
});
}
}
}
/*第48行*/公共类RecycleServiceAdapter扩展了RecycleView.Adapter{
公共RecycleServiceAdapter(上下文上下文、ArrayList ArrayList、ArrayList FavoriteItemList、int totalCount{…}
@凌驾
公共长getItemId(int位置){…}
@凌驾
public RecycleServiceAdapter.RecycleServiceWholder onCreateViewHolder(视图组父级,int-viewType){
开关(视图类型){
案例广告视图类型:
View nativeExpressLayoutView=LayoutFlater.from(parent.getContext())
.充气(R.layout.native\u express\u ad\u container,父级,false);
/*第84行*/返回新的NativeExpressAdViewHolder(nativeExpressLayoutView);
案例菜单\项目\视图\类型:
违约:
View=LayoutInflater.from(parent.getContext()).flate(R.layout.cards,parent,false);
返回新的RecycleServiceWholder(视图);
}
}
@凌驾
public void onBindViewHolder(最终RecyclerViewHolder持有者,最终int位置){…}
公共类NativeExpressAdViewHolder扩展了RecycleServiceWholder{
NativeExpressAdViewHolder(视图){
/*第150行*/super(视图);
}
}
@凌驾
公共int getItemViewType(int位置){…}
@凌驾
public int getItemCount(){…}
/*第165行*/公共类RecyclerViewHolder扩展了RecyclerView.ViewHolder{
文本视图标题;
相对的相对的;
相对性描述;
简单回顾图像;
ImageView收藏夹按钮;
cardsettergeter cardsettergeter;
图像视图共享;
private RecycleServiceWholder(查看项目视图){
超级(项目视图);
title=(TextView)itemView.findViewById(R.id.image\u title);
relativeLayout=(relativeLayout)itemView.findViewById(R.id.activity\u dash\u board);
cardDescription=(RelativeLayout)itemView.findViewById(R.id.card\U详细信息);
image=(simpledraweview)itemView.findviewbyd(R.id.image);
Favorite_按钮=(ImageView)itemView.findViewById(R.id.Favorite_按钮);
share=(ImageView)itemviewbyd(R.id.share);
/*第186行*/image.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
活动=(活动)上下文;
saveInfo(constants.SERVERIP.concat(cardsetterget.getImageurl()),cardsetterget.getImageId(),cardsetterget.getDescription(),cardsetterget.getImagetitle(),cardsetterget.getFavorite());
Intent i=new Intent().setClass(context,DetailsImageviewActivity.class);
i、 setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
背景。起始触觉(i);
activity.overridePendingTransition(R.anim.pull_from_right,R.anim.pull_out_right);
}
});
}
}
}
我知道什么是Null PoExtExchange,我知道解决这些问题的方法,但是在这种情况下,我很难找到问题的根源和解决办法。所以如果解决方案很简单,请不要把问题标记为复制品,请考虑帮助我解决这个问题。
< P>当2个不同视图类型膨胀时在recyclerView中,我们需要创建两个独立的ViewHolder
类来包含每个布局中的不同元素
请尝试以下操作:
//make this a separate class,but not inside the onBindViewHolder
private class NativeExpressAdViewHolder extends RecyclerView.ViewHolder{
NativeExpressAdViewHolder(View view){
super(view);
//find the view here
adView = (NativeExpressAdView)view.findViewById(R.id.native_ad);
}
private class RecyclerViewHolder extends RecyclerView.ViewHolder{
//this one as usual..
}
//change your onCreateViewHolder for this as well,
// cause now you have 2 view type,so you just override from universal
//RecyclerView.ViewHolder,not need RecyclerViewAdapter.RecyclerViewHolder
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { }
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
int viewType = getItemViewType(position);
switch (viewType){
case AD_VIEW_TYPE:
final NativeExpressAdViewHolder adHolder (NativeExpressAdViewHolder)holder
//here find your view and load the ad
break;
case MENU_ITEM_VIEW_TYPE:
final RecyclerViewHolder viewHolder = (RecyclerViewHolder)holder
//do your thing here,find view,assign value to the layout
}
还有一件事,请检查您的XML,您的XML应该如下所示
<com.google.android.gms.ads.NativeExpressAdView
xmlns:ads="http://schemas.android.com/apk/res-auto"
android:id="@+id/native_ad"
android:layout_gravity="center_horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
ads:adSize="360x132"
ads:adUnitId="@string/your_ads">
</com.google.android.gms.ads.NativeExpressAdView>
我知道什么是NullPointerException以及如何修复它。只是我在这里找不到问题。这就是为什么我需要问题特定的解决方案,而不是一般的解决方案。为什么您的公共类NativeExpressAdViewHolder扩展了RecycleServiceWholder{
在你的onBindViewHolder中
?@ken因为演员阵容问题,我在这里问了一个关于StackOverflow的问题,有人建议我这样做,它解决了这个问题。谢谢你的回答,ken,但是NativeExpressAdViewHolder的onBindViewHolder已经用完了,你想让我在另一个java文件中使用它吗?如果它已经读过了