панель поиска не работает - PullRequest
0 голосов
/ 15 мая 2019

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

setadapter_method

 private void setAdapter(final String searchedstring) {

    databaseReference.child("teacher").addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

            fullnamelist.clear();
            recyclerView.removeAllViews();
            int counter=0;

            for (DataSnapshot snapshot:dataSnapshot.getChildren()){
                String uid =snapshot.getKey();
                String full_name=snapshot.child("name").getValue(String.class);

                if(full_name.toLowerCase().contains(searchedstring)){
                    fullnamelist.add(full_name);
                    counter++;
                }

                if(counter==10)
                    break;
            }

            searchAdapter = new searchadapter(getActivity(),fullnamelist);
            recyclerView.setAdapter(searchAdapter);

        }

searchadapter.java

public class searchadapter extends RecyclerView.Adapter<searchadapter.SearchViewHolder> {


Context context;

ArrayList<String> fullnamelist;

class SearchViewHolder extends RecyclerView.ViewHolder{

    TextView full_name;

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

        full_name=(TextView)itemView.findViewById(R.id.full_name);
    }
}

public searchadapter(Context context, ArrayList<String> fullnamelist) {
    this.context = context;
    this.fullnamelist = fullnamelist;
}

@NonNull
@Override
public searchadapter.SearchViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
   View view = LayoutInflater.from(context).inflate(R.layout.search_list, parent ,false);
    return new searchadapter.SearchViewHolder(view);
}

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

    holder.full_name.setText(fullnamelist.get(position));
}



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

}

реализует панель поиска во фрагменте, чтобы создать представление для фрагмента

public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
   View v= inflater.inflate(R.layout.fragment_groupformation,null);

    mfirestore=FirebaseFirestore.getInstance();

    databaseReference= FirebaseDatabase.getInstance().getReference();

recyclerView=(RecyclerView)v.findViewById(R.id.recyclerview);

    ET1=(EditText)v.findViewById(R.id.ET1);
    ET2=(EditText)v.findViewById(R.id.ET2);
    ET3=(EditText)v.findViewById(R.id.ET3);
    ET4=(EditText)v.findViewById(R.id.ET4);
    ET5=(EditText)v.findViewById(R.id.ET5);
    search_edittext=(EditText)v.findViewById(R.id.search_edittext);
    submit=(Button)v.findViewById(R.id.submit);

    fullnamelist=new ArrayList<>();


    recyclerView.setHasFixedSize(true);
    recyclerView.setLayoutManager((new LinearLayoutManager(this.getActivity())));
    recyclerView.addItemDecoration(new DividerItemDecoration(getActivity(),LinearLayoutManager.VERTICAL));

    search_edittext.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

        }

        @Override
        public void afterTextChanged(Editable s) {
            if(!s.toString().isEmpty()){
            setAdapter(s.toString());
            }
        }
    });


   return v;
}

Error_log обнаружил мой телефон. Скорее всего, ошибка происходит из-за метода setadapter. Но я не могу понять это.

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.String.toLowerCase()' on a null object reference
at com.kiit.projectmanager.groupformation_fragment$2.onDataChange(groupformation_fragment.java:108)
at com.google.firebase.database.Query$1.onDataChange(com.google.firebase:firebase-database@@16.1.0:183)
at com.google.firebase.database.core.ValueEventRegistration.fireEvent(com.google.firebase:firebase-database@@16.1.0:75)
at com.google.firebase.database.core.view.DataEvent.fire(com.google.firebase:firebase-database@@16.1.0:63)
at com.google.firebase.database.core.view.EventRaiser$1.run(com.google.firebase:firebase-database@@16.1.0:55)
at android.os.Handler.handleCallback(Handler.java:742)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:157)
at android.app.ActivityThread.main(ActivityThread.java:5603)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:774)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:652)

enter image description here

Ответы [ 2 ]

0 голосов
/ 15 мая 2019

Вы используете неверный ключ («имя»), из-за которого full_name становится нулевым, следовательно, исключение нулевого указателя.

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

String full_name=snapshot.child("full_name").getValue(String.class);
0 голосов
/ 15 мая 2019

Изменить это:

String full_name = snapshot.child("name").getValue(String.class);

в это:

String full_name = snapshot.child("full_name").getValue(String.class);

Согласно вашей базе данных, у вас есть дочерний атрибут с именем full_name, поэтому вам нужно указать точное имя, которое есть в вашей базе данных, в качестве параметра в методе child()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...