Я работаю над Android-проектом (приложение с базовой информацией о колледже), у меня есть три основных вида деятельности, например, Goal/Course Select activity -> CollegeList activity -> College Details Activity. Теперь, когда я снова нажимаю на College Details Activity, он вылетает с этой ошибкой:

Попытка вызвать виртуальный метод int java.lang.String.hashCode () для ссылки на нулевой объект

Ниже приведены файлы / код, которые, как я думаю, могут нести ответственность за это ...

Файл CollegeListActivity.java

package com.anurag.college_information.activities;

import static com.anurag.college_information.activities.CareerGoalActivity.GOAL;
import static com.anurag.college_information.activities.CareerGoalActivity.SHARED_PREFS;

import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.anurag.college_information.R;
import com.anurag.college_information.adapters.RecyclerAdapter;
import com.anurag.college_information.models.ModelClass;

import java.util.ArrayList;
import java.util.List;

public class CollegeListActivity extends AppCompatActivity {

    private RecyclerAdapter.RecyclerViewClickListener listener;

    //ListView collegeList;
    TextView collegeListTitle;
    Button courseChange;
    RecyclerView recyclerView;
    LinearLayoutManager LayoutManager;
    RecyclerAdapter recyclerAdapter;
    List<ModelClass> cList;

    String courseName;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_college_list);

        collegeListTitle = findViewById(R.id.college_list_title);
        courseChange = findViewById(R.id.btn_change_course);

        //collegeListTitle.setText(goal + "Colleges");

        collegeListTitle.setText(getIntent().getStringExtra("Title") + " Colleges");

        initData();
        initRecyclerView();

        //collegeList = findViewById(R.id.lv_college_list);


        courseChange.setTransformationMethod(null);
        courseChange.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                SharedPreferences sharedPreferences = getSharedPreferences(SHARED_PREFS, MODE_PRIVATE);
                SharedPreferences.Editor editor = sharedPreferences.edit();
                editor.clear();
                editor.apply();

                Intent i = new Intent(CollegeListActivity.this, CareerGoalActivity.class);
                startActivity(i);
                //finish();

            }
        });

    }

    private void initData() {
        cList = new ArrayList<>();
        courseName = getIntent().getStringExtra("Title");

        switch (courseName) {

            case "BE/BTech":
                cList.add(new ModelClass("https://images.static-collegedunia.com/public/college_data/images/campusimage/1479294300b-5.jpg", "A.P. Shah College of Engineering", "Thane", "8.0"));
                break;

            case "Pharmacy":
                cList.add(new ModelClass("https://images.static-collegedunia.com/public/college_data/images/campusimage/14382400753.jpg", "Bombay College Of Pharmacy", "Mumbai", "9.0"));
                break;
        }
    }

    private void initRecyclerView() {
        setOnClickListener();

        recyclerView = findViewById(R.id.recycler_view);
        LayoutManager = new LinearLayoutManager(this);
        LayoutManager.setOrientation(RecyclerView.VERTICAL);
        recyclerView.setLayoutManager(LayoutManager);
        recyclerAdapter = new RecyclerAdapter(cList, listener);
        recyclerView.setAdapter(recyclerAdapter);
    }

    private void setOnClickListener() {
        listener = new RecyclerAdapter.RecyclerViewClickListener() {
            @Override
            public void onClick(View v, int position) {
                Intent i = new Intent(CollegeListActivity.this, CollegeDetailsActivity.class);
                startActivity(i);
            }
        };
    }

    @Override
    public void onBackPressed() {
        new AlertDialog.Builder(this)
                .setMessage("Are you sure you want to exit?")
                .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        finish();
                    }
                })
                .setNegativeButton("No", null)
                .show();
    }
}

< Сильный > RecyclerAdapter.java

package com.anurag.college_information.adapters;

import android.content.Context;
import android.content.Intent;
import android.telecom.Call;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.anurag.college_information.activities.CollegeDetailsActivity;
import com.anurag.college_information.models.ModelClass;
import com.anurag.college_information.R;
import com.squareup.picasso.Picasso;

import java.util.List;

public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> {


    private List<ModelClass> collegeList ;
    private RecyclerViewClickListener listener;

    List<String> imageUrl, collegeName, collegeLocation, collegeRating;


    public RecyclerAdapter(List<ModelClass> collegeList, RecyclerViewClickListener listener){
        this.collegeList=collegeList;
        this.listener = listener;

    }

    @NonNull
    @Override
    public RecyclerAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.college_list_single_row, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerAdapter.ViewHolder holder, int position) {

        String imageLink = collegeList.get(position).getImageLink();
        //int img = collegeList.get(position).getCollegeImage();
        String cName = collegeList.get(position).getCollegeName();
        String cRating = collegeList.get(position).getCollegeRating();
        String cLocation = collegeList.get(position).getLocation();
        Picasso.get().load(imageLink).into(holder.imageView);

        //holder.setData(img, cName, cRating);
        holder.setData(imageLink, cName, cLocation ,cRating);

    }

    @Override
    public int getItemCount() {
        return collegeList.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        private ImageView imageView;
        private TextView collegeName, collegeRating, collegeLocation;


        public ViewHolder(@NonNull View itemView) {
            super(itemView);

            imageView = itemView.findViewById(R.id.college_image);
            collegeName = itemView.findViewById(R.id.college_name);
            collegeRating = itemView.findViewById(R.id.college_rating);
            collegeLocation = itemView.findViewById(R.id.college_location);

            itemView.setOnClickListener(this);

        }

        public void setData(String imageLink, String cName, String cLocation, String cRating) {

            //imageView.setImageResource(img);
            Picasso.get().load(imageLink).error(R.drawable.error).into(imageView);
            collegeName.setText(cName);
            collegeRating.setText(cRating);
            collegeLocation.setText(cLocation);


        }

        @Override
        public void onClick(View v) {
            listener.onClick(v, getAdapterPosition());

            Intent i = new Intent(v.getContext(), CollegeDetailsActivity.class);

            i.putExtra("collegeImage", collegeList.get(getAdapterPosition()).getImageLink());
            i.putExtra("collegeName", collegeList.get(getAdapterPosition()).getCollegeName());
            i.putExtra("collegeRating", collegeList.get(getAdapterPosition()).getCollegeRating());
            i.putExtra("collegeLocation", collegeList.get(getAdapterPosition()).getLocation());

            v.getContext().startActivity(i);

        }

    }
    public interface RecyclerViewClickListener{
        void onClick(View v, int position);
    }
}

CollegeDetailsActivity.java

package com.anurag.college_information.activities;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

import com.anurag.college_information.R;
import com.squareup.picasso.Picasso;

public class CollegeDetailsActivity extends AppCompatActivity {

    Button btnApply;
    ImageView dCollegeImage;
    TextView dCollegeName, dCollegeRating, dCollegeLocation;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_college_details);

        dCollegeImage = findViewById(R.id.details_college_image);
        dCollegeName = findViewById(R.id.details_college_name);
        dCollegeRating = findViewById(R.id.details_college_rating);
        dCollegeLocation = findViewById(R.id.details_college_location);

        btnApply = findViewById(R.id.btn_apply);

        Intent i = getIntent();
        String cn = i.getStringExtra("collegeName");
        String cr = i.getStringExtra("collegeRating");
        String ci = i.getStringExtra("collegeImage");
        String cl = i.getStringExtra("collegeLocation");

        Picasso.get().load(ci).error(R.drawable.error).into(dCollegeImage);
        dCollegeName.setText(cn);
        dCollegeRating.setText(cr);
        dCollegeLocation.setText(cl);


        btnApply.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(getApplicationContext(), "The institute will be notified, of your application", Toast.LENGTH_LONG).show();
                Toast.makeText(getApplicationContext(), "The college will contact you, Thank you", Toast.LENGTH_LONG).show();
            }
        });
    }

    @Override
    public void onBackPressed() {

        Intent i = new Intent(CollegeDetailsActivity.this, CollegeListActivity.class);
        startActivity(i);
    }

}

Это скриншот ошибки: Это скриншот ошибки

Я новичок в Android, я только что работал над проектами от 4 до 5, любая помощь будет оценена, спасибо

Закомментированный код Out - это просто обычное представление списка, которое я реализовал на всякий случай, мне нужно удалить представление ресайклера.

1
AnuragK 26 Ноя 2021 в 19:39

1 ответ

Лучший ответ

Это, вероятно, исчезнет, ​​если вы не переопределите onBackPressed в CollegeDetailsActivity. Вместо того, чтобы возвращаться к действию, у которого была допустимая дополнительная строка «Заголовок», опубликованный вами код перейдет к новому действию, где «Заголовок» не определен, а затем получит исключение NullPointerException, поскольку courseName будет иметь значение null в initData (сообщение об ошибке приводит к ошибке в строке 81 этого метода). Использование пустой строки в переключателе приводит к ошибке этого типа < / а>

Просто удалите onBackPressed полностью в CollegeDetailsActivity.

1
Tyler V 26 Ноя 2021 в 22:34
Итак, теперь приложение не дает сбоев, но при нажатии back один раз отображается тот же CollegeDetailsActivty, без каких-либо данных, просто пустой макет со всеми представлениями, но без данных. есть решение? Изменить: он переходит к предыдущему экрану, когда дважды нажимается назад
 – 
AnuragK
27 Ноя 2021 в 04:34
У вас есть два места, где вы запускаете действие Details - один раз в RecyclerAdapter и еще раз в прослушивателе кликов. Вы запускаете действие подробностей дважды, поэтому нажатие «назад» возвращает к первому из них. Вы захотите исправить это, чтобы он запускался только один раз. Удалите тот, который установлен в CollegeListActivity - он не передает никаких параметров новому действию, не исправляет его и не запускает намерение в RecyclerAdapter (в любом случае - просто не делайте это дважды)
 – 
Tyler V
27 Ноя 2021 в 04:52