Hello I am new in Android development
I have tried different way to show data in RecyclerView
from firebase. At first I set on click listener on item of RecyclerView and it work’s fine but After that I make some changes in code now I am trying to test it’s showing Null Exception pointer but I didn’t change anything on Adapter So why it’s showing Null pointer Exception can you please check Where I am mistaking.
When I click on RecyclerView item Activity is automatically getting close.
see my Log cat
*LogCat
2020-10-29 16:15:14.953 21026-21026/? E/gamesdownloade: Unknown bits set in runtime_flags: 0x8000
2020-10-29 16:15:14.977 21026-21026/? E/libc: Access denied finding property "persist.sys.theme"
2020-10-29 16:15:15.041 21026-21055/? E/Perf: Fail to get file list com.downloadfrom.psp.gamesdownloader
2020-10-29 16:15:15.042 21026-21055/? E/Perf: getFolderSize() : Exception_1 = java.lang.NullPointerException: Attempt to get length of null array
2020-10-29 16:15:15.042 21026-21055/? E/Perf: Fail to get file list com.downloadfrom.psp.gamesdownloader
2020-10-29 16:15:15.042 21026-21055/? E/Perf: getFolderSize() : Exception_1 = java.lang.NullPointerException: Attempt to get length of null array
2020-10-29 16:15:24.376 21026-21026/com.downloadfrom.psp.gamesdownloader E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.downloadfrom.psp.gamesdownloader, PID: 21026
java.lang.NullPointerException: Attempt to invoke interface method 'void com.downloadfrom.psp.gamesdownloader.ViewHolder$ClickListener.onItemClick(android.view.View, int)' on a null object reference
at com.downloadfrom.psp.gamesdownloader.ViewHolder$1.onClick(ViewHolder.java:23)
at android.view.View.performClick(View.java:7259)
at android.view.View.performClickInternal(View.java:7221)
at android.view.View.access$3800(View.java:821)
at android.view.View$PerformClick.run(View.java:27716)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:227)
at android.app.ActivityThread.main(ActivityThread.java:7842)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:980)
This is my View Holder/Adepter of Recycler view Check it please.
package com.example.my.app;
import android.content.Context;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.recyclerview.widget.RecyclerView;
import com.squareup.picasso.Picasso;
public class ViewHolder extends RecyclerView.ViewHolder {
View view;
public ViewHolder( View itemView) {
super(itemView);
view = itemView;
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mClickListener.onItemClick(view,getAdapterPosition());
}
});
itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
mClickListener.onItemLongClick(view, getAdapterPosition());
return true;
}
});
}
public void setDetails(Context ctx, String title, String image,String download,String size, String discription){
TextView GameName;
TextView Size,Download,Discription;
ImageView GameImage;
Size = view.findViewById(R.id.Getsize);
Download = view.findViewById(R.id.Getdownload);
Discription = view.findViewById(R.id.Getdiscription);
GameName = view.findViewById(R.id.title_item);
GameImage = view.findViewById(R.id.thumbnail_item);
GameName.setText(title);
Picasso.get().load(image).into(GameImage);
Size.setText(size);
Download.setText(download);
Discription.setText(discription);
}
private ViewHolder.ClickListener mClickListener;
public interface ClickListener{
void onItemClick(View view,int position);
void onItemLongClick(View view,int position);
}
public void setOnClickListener(ViewHolder.ClickListener clickListener){
mClickListener = clickListener;
}
}
This is my MainActivity On start method In the this method I am showing data in Recycler View from firebase And Also set on click listener here check it please
//MainActivity On start Method
@Override
protected void onStart() {
super.onStart();
FirebaseRecyclerAdapter<Games, ViewHolder> firebaseRecyclerAdapter =
new FirebaseRecyclerAdapter<Games, ViewHolder>(
Games.class,
R.layout.cardview_list_item,
ViewHolder.class,
mRef
) {
@Override
protected void populateViewHolder(ViewHolder viewHolder, Games games, int i) {
viewHolder.setDetails(getApplicationContext(), games.getTitle(), games.getImage(),
games.getSize(),games.getDownload(),games.getDiscription());
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
ViewHolder viewHolder = super.onCreateViewHolder(parent,viewType);
viewHolder.setOnClickListener(new ViewHolder.ClickListener() {
@Override
public void onItemClick(View view, int position) {
Toast.makeText(MainActivity.this,"You Clicked on this Game",Toast.LENGTH_SHORT).show();
}
@Override
public void onItemLongClick(View view, int position) {
Toast.makeText(MainActivity.this,"You Long Clicked on this Game",Toast.LENGTH_SHORT).show();
}
});
return super.onCreateViewHolder(parent, viewType);
}
};
recyclerView.setAdapter(firebaseRecyclerAdapter);
}
And Also check Model class
package com.example.my.app;
public class Games {
String title;
String size;
String image;
String download;
String discription;
public Games() {
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getSize() {
return size;
}
public void setSize(String size) {
this.size = size;
}
public String getImage() {
return image;
}
public void setImage(String image) {
this.image = image;
}
public String getDownload() {
return download;
}
public void setDownload(String download) {
this.download = download;
}
public String getDiscription() {
return discription;
}
public void setDiscription(String discription) {
this.discription = discription;
}
}
Advertisement
Answer
Your ViewHolder is null
inside the onCreateViewHolder
method
Instead of using
ViewHolder viewHolder = super.onCreateViewHolder(parent,viewType);
Use this
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.your_xml_layout, parent, false);
return new ViewHolder(view);
and @Override onBindViewHolder
method
@Override
protected void onBindViewHolder(ViewHolder holder, final int position, Model model) {
holder.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// your click logic
}
});
}