Почему выбор элемента не работает в режиме просмотра в обычном списке, а работает в списке поиска? - PullRequest
1 голос
/ 17 февраля 2020

Я создал arraylist для проектов, который хранится в базе данных Firebase. Я был в состоянии перечислить проекты в переработке. Даже поиск тоже работает нормально. Но когда дело доходит до щелчка элемента в списке повторного просмотра, щелчок работает в списке поиска, но не работает в обычном списке. Код указан ниже

public class MainActivity extends AppCompatActivity implements Adapter.SelectedProject {

    DatabaseReference mDatabase;
    ArrayList<projects> list;
    RecyclerView PList;

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

        PList = findViewById(R.id.ProjList);
        PList.setHasFixedSize(true);
        mDatabase = FirebaseDatabase.getInstance().getReference().child("Projects");
    }

    @Override
    protected void onStart() {
        super.onStart();

        if (mDatabase != null) {

            mDatabase.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                    if (dataSnapshot.exists()) {

                        list = new ArrayList<>();
                        for (DataSnapshot ds : dataSnapshot.getChildren()) {
                            list.add(ds.getValue(projects.class));
                        }
                        Adapter adapter = new Adapter(list, null);
                        PList.setAdapter(adapter);
                    }
                }

                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {

                    Toast.makeText(MainActivity.this, databaseError.getMessage(), Toast.LENGTH_SHORT).show();

                }
            });
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.menu_home, menu);
        MenuItem item = menu.findItem(R.id.search);
        SearchView searchView = (SearchView) item.getActionView();

        if (searchView != null) {

            searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
                @Override
                public boolean onQueryTextSubmit(String query) {
                    return false;
                }

                @Override
                public boolean onQueryTextChange(String newText) {
                    search(newText);
                    return true;
                }
            });
        }

        return super.onCreateOptionsMenu(menu);
    }

    private void search(String str) {

        ArrayList<projects> sList = new ArrayList<>();

        for (projects object : list) {

            if (object.getPname().toLowerCase().contains(str.toLowerCase())) {

                sList.add(object);
            }

        }
        Adapter adapter = new Adapter(sList, this);
        PList.setAdapter(adapter);

    }

    @Override
    public void selectedProject(projects projects) {
        startActivity(new Intent(MainActivity.this, InfoActivity.class));
    }
}

Класс адаптера

public class Adapter extends RecyclerView.Adapter < Adapter.ProjViewHolder > {

    private ArrayList < projects > list;
    private SelectedProject selectedProject;

    public Adapter(ArrayList < projects > list, SelectedProject selectedProject) {

        this.list = list;
        this.selectedProject = selectedProject;
    }

    @NonNull
    @Override
    public ProjViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.proj_list, parent, false);
        return new ProjViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ProjViewHolder holder, int position) {

        holder.prname.setText(list.get(position).getPname());
        holder.prlocation.setText(list.get(position).getPlocation());

    }

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

    public interface SelectedProject {
        void selectedProject(projects projects);
    }

    class ProjViewHolder extends RecyclerView.ViewHolder {

        TextView prname, prlocation;

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

            prname = itemView.findViewById(R.id.FPName);
            prlocation = itemView.findViewById(R.id.FPLocation);

            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    selectedProject.selectedProject(list.get(getAdapterPosition()));
                }
            });
        }
    }
}

Выбор принят в поисковом адаптере.

Adapter adapter = new Adapter(sList,this);

Но обычный адаптер показывает ошибку для приведенного ниже кода.

Adapter adapter = new Adapter(list,this);

Но если я изменю это значение на ноль, как показано ниже, ошибка исчезнет.

Adapter adapter = new Adapter(list,null);

Но когда я нажал, приложение закрылось.

Пожалуйста, дайте мне знать, как исправить ошибку?

сведения о стеке

 java.lang.NullPointerException: Attempt to invoke interface method 'void com.example.volq.Adapter$SelectedProject.selectedProject(com.example.volq.projects)' on a null object reference
    at com.example.volq.Adapter$ProjViewHolder$1.onClick(Adapter.java:68)
    at android.view.View.performClick(View.java:5610)
    at android.view.View$PerformClick.run(View.java:22265)
    at android.os.Handler.handleCallback(Handler.java:751)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:154)
    at android.app.ActivityThread.main(ActivityThread.java:6077)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)

1 Ответ

1 голос
/ 18 февраля 2020

Обратите внимание на разницу между настройкой адаптера для поиска по сравнению с обычным

Adapter adapter = new Adapter(sList, this); // `this`as the second parameter/listener is ok

Но для другого:

Adapter adapter = new Adapter(list, null);

Здесь слушатель равен нулю, эта ошибка имеет смысл:

java .lang.NullPointerException: попытка вызвать метод интерфейса «void com.example.volq.Adapter $ SelectedProject.selectedProject (com.example.volq.projects)» для null ссылка на объект

Вместо нуля просто введите MainActivity.this в обратном вызове onStart() вашей деятельности:

Adapter adapter = new Adapter(list, MainActivity.this);

Но обычный адаптер показывает ошибку для приведенного ниже кода.

Adapter adapter = new Adapter(list,this);

Это из-за того, что this не ссылается на MainActivity внутри onDataChange() обратного вызова, это относится к ValueEventListener

...