[英]Null pointer Exception on Recycler View On item click listener Activity Close when item got clicked
你好,我是 Android 開發新手
我嘗試了不同的方式來顯示來自 firebase 的RecyclerView
數據。 起初,我在 RecyclerView 的項目上設置了單擊偵聽器,它工作正常,但之后我對代碼進行了一些更改,現在我正在嘗試測試它是否顯示 Null Exception 指針,但我沒有更改 Adapter 上的任何內容 那么為什么它顯示 Null 指針例外,你能不能檢查一下我錯在哪里。 當我點擊 RecyclerView 項目時,Activity 會自動接近。
看我的日志貓
*日志貓
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)
這是我的視圖持有者/回收者視圖的專家請檢查一下。
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;
}
}
這是我的 MainActivity On start 方法在此方法中,我在來自 firebase 的 Recycler View 中顯示數據,並在此處設置單擊偵聽器,請檢查它
//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);
}
並且還檢查模型類
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;
}
}
您的 ViewHolder 在onCreateViewHolder
方法中為null
而不是使用
ViewHolder viewHolder = super.onCreateViewHolder(parent,viewType);
用這個
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.your_xml_layout, parent, false);
return new ViewHolder(view);
和@Override onBindViewHolder
方法
@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
}
});
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.