簡體   English   中英

回收器視圖上的空指針異常項目單擊偵聽器活動在單擊項目時關閉

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM