Android: Всегда получать нулевой объект в дополнениях, переданных в намерении - PullRequest
0 голосов
/ 02 февраля 2020

Я создаю представление переработчика в своем приложении и извлекаю данные из Firestore для того же самого. В процессе я передаю некоторые аргументы намерению, которое вызывается при нажатии на элемент в представлении переработчика.

RecyclerView recyclerView = findViewById(R.id.my_recycler_view);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.setAdapter(adapter);

        adapter.setOnItemClickListener(new LearningModuleAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(DocumentSnapshot documentSnapshot, int position) {
                LearningModule learningModule = documentSnapshot.toObject(LearningModule.class);
                String id=documentSnapshot.getId();
                String path = documentSnapshot.getReference().getPath();
                String title = (String) documentSnapshot.get("title");
                System.out.println("what did i get from document snapshot? id: "+id+" path:"+path+" title:"+title);
                Intent intent = new Intent(learn.this,learn_content.class);
                intent.putExtra("title",title);
                startActivity(intent);
            }
        });

Вывод из операторов печати в вышеприведенном коде выглядит следующим образом:

what did i get from document snapshot? id: EsHW9FGjVe8A3pG4 path:LearningModules/EsHW9FGjVe8A3pG4 title:Front Load vs Top Load

Метод onClick вызываемой операции выглядит следующим образом:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.content_learn_view_pager);
        viewPager = findViewById(R.id.pager);
        progressBar = findViewById(R.id.progressBarViewPager);
        Bundle extras;
        extras = getIntent().getExtras();
        System.out.println("captured form the first " + extras.getString("title"));

Однако этот фрагмент кода выдает ошибку NullPointerException для оператора печати.

Куда я иду не так?

Дополнительный код:

  • Адаптер
public class LearningModuleAdapter extends FirestoreRecyclerAdapter<LearningModule, LearningModuleAdapter.LearningModuleViewHolder> {
    private OnItemClickListener listener;


    public LearningModuleAdapter(@NonNull FirestoreRecyclerOptions<LearningModule> options) {
        super(options);
    }


    @Override
    protected void onBindViewHolder(@NonNull final LearningModuleViewHolder holder, final int position, @NonNull LearningModule model) {
        holder.title.setText(model.getTitle());
//        holder.img.setImageResource(model.getImg());

    }

    @NonNull
    @Override
    public LearningModuleViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType){
        View v= LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item,parent,false);
        return new LearningModuleViewHolder(v);
    }


    public class LearningModuleViewHolder extends RecyclerView.ViewHolder {
        public View view;
        public TextView title;
        public ImageView img;

        public LearningModuleViewHolder(View v) {
            super(v);
            view = v;
            img = itemView.findViewById(R.id.list_image);
            title = itemView.findViewById(R.id.list_text_title);

            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    System.out.println("The click was captured");
                    int position = getAdapterPosition();
                    if(position!=RecyclerView.NO_POSITION && null!=listener){
                        listener.onItemClick(getSnapshots().getSnapshot(position),position);
                    }
                    Intent intent = new Intent(view.getContext(), learn_content.class);
                    view.getContext().startActivity(intent);
                }
            });
        }

    }

    public interface OnItemClickListener{
        void onItemClick(DocumentSnapshot documentSnapshot,int position);
    }

    public void setOnItemClickListener(OnItemClickListener listener){
        this.listener = listener;
    }


}
  • Ошибка Stacktrace
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.gigforce.app/com.gigforce.app.learn_content}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.os.Bundle.getString(java.lang.String)' on a null object reference
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3270)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
        at android.os.Handler.dispatchMessage(Handler.java:107)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7356)
        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:930)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.os.Bundle.getString(java.lang.String)' on a null object reference
        at com.gigforce.app.learn_content.onCreate(learn_content.java:45)
        at android.app.Activity.performCreate(Activity.java:7802)
        at android.app.Activity.performCreate(Activity.java:7791)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1299)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3245)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409) 
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016) 
        at android.os.Handler.dispatchMessage(Handler.java:107) 
        at android.os.Looper.loop(Looper.java:214) 
        at android.app.ActivityThread.main(ActivityThread.java:7356)

Ответы [ 3 ]

2 голосов
/ 02 февраля 2020

Попробуйте это:

       Intent i = getIntent()

if (i == null) 
   Log.d("***DEBUG****", "Intent was null");
    else
   Log.d("**** DEBUG ***", "Intent OK");

 String title= i.getStringExtra("title"); //Exception points to this line
 Log.d("*** DEBUG", rec + " " + title);

Также при просмотре элемента вы не пропускаете заголовок, см. Ниже

 itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                System.out.println("The click was captured");
                int position = getAdapterPosition();
                if(position!=RecyclerView.NO_POSITION && null!=listener){

       listener.onItemClick(getSnapshots().getSnapshot(position),position);
                }
                Intent intent = new Intent(view.getContext(), 
     learn_content.class);
                 intent.putExtra("title",title);  //This one
                view.getContext().startActivity(intent);
            }
        });
1 голос
/ 02 февраля 2020

Вы звоните startActivity дважды, что вызывает проблему.

Опция - 1: Попробуйте удалить изнутри itemView.setOnClickListener, как показано ниже:

itemView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        System.out.println("The click was captured");
        int position = getAdapterPosition();
        if(position!=RecyclerView.NO_POSITION && null!=listener){
            listener.onItemClick(getSnapshots().getSnapshot(position),position);
        }

        //Intent intent = new Intent(view.getContext(), learn_content.class);
        //view.getContext().startActivity(intent);
    }
});

Опция - 2: Попробуйте запустить действие внутри itemView.setOnClickListener и удалите OnItemClickListener связанный код, как показано ниже:

itemView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        System.out.println("The click was captured");
        int position = getAdapterPosition();

        /*if(position!=RecyclerView.NO_POSITION && null!=listener){
            listener.onItemClick(getSnapshots().getSnapshot(position),position);
        }*/

        Intent intent = new Intent(view.getContext(), learn_content.class);

        DocumentSnapshot documentSnapshot = getSnapshots().getSnapshot(position);
        String title = (String) documentSnapshot.get("title");

        intent.putExtra("title",title);
        view.getContext().startActivity(intent);
    }
});
0 голосов
/ 02 февраля 2020

Мое альтернативное решение: вместо того, чтобы помещать прослушиватель кликов в класс LearningModuleViewHolder, введите onCreateViewHolder , так что теперь представление не будет нулевым. Я попытаюсь добавить код здесь:

 @NonNull
@Override
public LearningModuleViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType){
    View v= LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item,parent,false);
    LearningModuleViewHolder holder = new LearningModuleViewHolder(v);
    v.setOnClickListener(v -> {

            System.out.println("The click was captured");
            Intent intent = new Intent(parent.getContext(), learn_content.class);
        parent.getContext().startActivity(intent);

    });

    return holder;
}
...