Я новичок в android разработке. Мой RecyclerView
работает и показывает необходимый макет, но возникает проблема, когда я пытаюсь увеличить количество пунктов меню методом invalidateMenu()
, когда пользователь нажимает кнопку «Мне нравится» в элементе RecyclerView
, но отображается ошибка.
E/ViewRootImpl: mView does not exist, so discard the remaining points.
java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.pm.ApplicationInfo android.content.Context.getApplicationInfo()' on a null object reference
нажатие кнопки присутствует в OnbindViewHolder()
методе адаптера
здесь код базовый класс для панели приложений: -
public class ActionBarBaseClass extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
public void updateCount(){
new ProductDetails().invalidateOptionsMenu();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.search_wish_cart, menu);
View cart=(View)menu.findItem(R.id.appbar_cart).getActionView();
View wish=(View)menu.findItem(R.id.appbar_wish).getActionView();
ImageView cartImg=cart.findViewById(R.id.img);
ImageView wishImg=wish.findViewById(R.id.img);
cartImg.setBackgroundResource(R.drawable.empty_cart);
wishImg.setBackgroundResource(R.drawable.wish);
NotificationBadge cartBadge=cart.findViewById(R.id.badge);
cartBadge.setText("0");
NotificationBadge wishBadge=wish.findViewById(R.id.badge);
wishBadge.setText("0");
SharedPreferences sp=getApplicationContext().getSharedPreferences("like",MODE_PRIVATE);
int likeNo=sp.getAll().size();
Log.d("sptag", "onCreateOptionsMenu: null"+likeNo);
wishBadge.setText(String.valueOf(likeNo));
return true;
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
View cart=(View)menu.findItem(R.id.appbar_cart).getActionView();
View wish=(View)menu.findItem(R.id.appbar_wish).getActionView();
NotificationBadge cartBadge=cart.findViewById(R.id.badge);
NotificationBadge wishBadge=wish.findViewById(R.id.badge);
SharedPreferences sp=getApplicationContext().getSharedPreferences("like",MODE_PRIVATE);
int likeNo=sp.getAll().size();
Log.d("sptag", "onCreateOptionsMenu: null"+likeNo);
wishBadge.setText(String.valueOf(likeNo));
return super.onPrepareOptionsMenu(menu);
}
}
Основной класс расширяет базовый класс: -
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_product_details);
Toolbar toolbar=findViewById(R.id.base_toolbar);
mainImg=findViewById(R.id.detail_imgTop);
title=findViewById(R.id.detail_title);
price=findViewById(R.id.detail_price);
likeCount=findViewById(R.id.detail_like_count);
wShare=findViewById(R.id.detail_share);
fabric=findViewById(R.id.detail_fabric);
productDiscp=findViewById(R.id.detail_discp_content);
adapter=new CatelogRecyclerAdapter(ProductDetails.this);
recyclerView=findViewById(R.id.detail_option);
GridLayoutManager gridLayoutManager=new GridLayoutManager(ProductDetails.this,2);
recyclerView.setLayoutManager(gridLayoutManager);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayShowTitleEnabled(false);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
bigList=(List<Product>)getIntent().getSerializableExtra("productList");
product=(Product)getIntent().getSerializableExtra("current");
Log.d("listdata", "onDetails: "+bigList.get(2).getCode());
setData();
}
private void shareIt() {
}
private void setData() {
List<Product> match=getMatchProduct();
adapter.setProductList(match);
recyclerView.setAdapter(adapter);
Picasso.get().load(product.getDownloadLink()).into(mainImg);
title.setText(product.getName());
price.setText("Rs "+product.getPrice());
fabric.setText("Fabric:-"+product.getFabric());
productDiscp.setText(product.getDiscp());
likeCount.setText(product.getLikes()+" Likes");
mainImg.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i=new Intent(ProductDetails.this, FullScreen.class);
i.putExtra("link",product.getDownloadLink());
startActivity(i);
}
});
wShare.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
shareIt();
}
});
}
private List<Product> getMatchProduct() {
List<Product> smallList=new ArrayList<>();
for (int i=0;i<bigList.size();i++){
Log.d("match", "getMatchProductlength: "+i);
Log.d("match", "getMatchProduct: "+product.getCode());
if(product.getCode().equals(bigList.get(i).getCode())){
Log.d("match", "getMatchProduct: found");
smallList.add(bigList.get(i));
}
}
return smallList;
}
переработчик Адаптер: -
import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
public class CatelogRecyclerAdapter extends RecyclerView.Adapter<CatelogRecyclerAdapter.ViewHolder> {
List<Product> productList;
Context context;
int likeCount=0;
SharedPreferences likes;
SharedPreferences.Editor editor;
DatabaseReference firebaseDatabase;
DatabaseReference likeBox;
ActionBarBaseClass barBaseClass;
public CatelogRecyclerAdapter(Context context) {
this.context=context;
likes=context.getSharedPreferences("like",Context.MODE_PRIVATE);
editor=likes.edit();
firebaseDatabase=FirebaseDatabase.getInstance().getReference();
barBaseClass=new ActionBarBaseClass();
}
public void setProductList(List<Product> productList) {
this.productList = productList;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.catelog_screen_item, parent, false);
return new ViewHolder(v);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, final int position) {
Picasso.get()
.load(productList.get(position).getDownloadLink())
.into(holder.img);
holder.name.setText(productList.get(position).getName());
holder.price.setText("Rs "+productList.get(position).getPrice());
holder.likeButton.setLiked(likes.contains(productList.get(position).getDownloadLink()));
final int pos=position;
holder.img.setOnClickListener(new View.OnClickListener() {
int pos=position;
String dbKey=productList.get(pos).getProdRandomKey();
String type=productList.get(pos).getType();
int oldlike=Integer.parseInt(productList.get(pos).getLikes());
@Override
public void onClick(View v) {
Intent i=new Intent(context, ProductDetails.class);
i.putExtra("current",(Serializable) productList.get(position));
i.putExtra("productList",(Serializable) productList);
i.setFlags(FLAG_ACTIVITY_NEW_TASK);
likeBox=firebaseDatabase.child("products").child(type).child(dbKey);
HashMap<String,Object> map=new HashMap<>();
map.put("likes",String.valueOf(oldlike+likeCount));
likeBox.updateChildren(map)
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.d("like", "onFailureLike: "+e.getMessage());
}
}).addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
Log.d("like", "onFailureLike: success");
}
});
context.startActivity(i);
}
});
holder.likeButton.setOnLikeListener(new OnLikeListener() {
int pos=position;
String keyItem=productList.get(pos).getDownloadLink();
@Override
public void liked(LikeButton likeButton) {
editor.putString(keyItem,"like");
editor.commit();
barBaseClass.updateCount();
likeCount++;
}
@Override
public void unLiked(LikeButton likeButton) {
if(likes.contains((keyItem))){
editor.remove(keyItem);
editor.commit();
barBaseClass.updateCount();
}
}
});
}
@Override
public int getItemCount() {
return productList.size();
}
class ViewHolder extends RecyclerView.ViewHolder{
ImageView img;
TextView name;
TextView price;
LikeButton likeButton;
public ViewHolder(@NonNull View itemView) {
super(itemView);
img=itemView.findViewById(R.id.catelog_img);
name=itemView.findViewById(R.id.catelog_name);
price=itemView.findViewById(R.id.catelog_price);
likeButton=itemView.findViewById(R.id.star_button);
}
}