SearchView filteredlist未显示recyclerview数据列表

时间:2018-02-24 09:35:18

标签: java android android-recyclerview searchview recycler-adapter

您好我可以问为什么我的搜索视图在搜索片段recyclerview时没有过滤数据列表,而且当我尝试搜索后再次点击片段活动时会导致错误

  

java.lang.NullPointerException:尝试调用接口方法   ' void java.util.List.add(int,java.lang.Object)'在null对象上   参考   com.google.firebase.ikuzou.database.MemberDetailAdapter $ UserChildEventListener.onChildAdded(MemberDetailAdapter.java:73)

RecyclerView适配器

public class MemberDetailAdapter extends RecyclerView.Adapter<MemberDetailAdapter.ViewHolder> implements Filterable {
private List<User1> mUser,nUser;
private Callback mCallback;
private DatabaseReference userref;


public MemberDetailAdapter(Callback callback) {
    mCallback = callback;
    mUser = new ArrayList<>();
    userref = FirebaseDatabase.getInstance().getReference().child("Accounts").child("Users");
    userref.addChildEventListener(new UserChildEventListener());

}

@Override
public Filter getFilter() {
    return new Filter() {
        @Override
        protected FilterResults performFiltering(CharSequence charSequence) {
            String charString = charSequence.toString();
            if (charString.isEmpty()){
                mUser=nUser;
            }else {
                List<User1> filteredList = new ArrayList<>();
                for (User1 row : nUser){
                    if (row.getFirst().toLowerCase().contains(charString.toLowerCase()) || row.getSecond().contains(charSequence)){
                        filteredList.add(row);
                    }
                }
                mUser=filteredList;
            }
            FilterResults filterResults = new FilterResults();
            filterResults.values = mUser;
            return filterResults;
        }

        @Override
        protected void publishResults(CharSequence charSequence, FilterResults filterResults) {

        }
    };
}

class UserChildEventListener implements ChildEventListener{

    @Override
    public void onChildAdded(DataSnapshot dataSnapshot, String s) {
        User1 user = dataSnapshot.getValue(User1.class);
        user.setKey(dataSnapshot.getKey());
        mUser.add(0,user);
        notifyDataSetChanged();

    }

    @Override
    public void onChildChanged(DataSnapshot dataSnapshot, String s) {
        String key = dataSnapshot.getKey();
        User1 updatedUser = dataSnapshot.getValue(User1.class);
        for (User1 user : mUser){
            if (user.getKey().equals(key)){
                user.setValues(updatedUser);
                notifyDataSetChanged();
                return;
            }
        }

    }

    @Override
    public void onChildRemoved(DataSnapshot dataSnapshot) {
        String key = dataSnapshot.getKey();
        for(User1 user: mUser){
            if (user.getKey().equals(key)){
                mUser.remove(user);
                break;

            }
        }
        notifyDataSetChanged();

    }

    @Override
    public void onChildMoved(DataSnapshot dataSnapshot, String s) {

    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
}

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

@Override
public void onBindViewHolder(ViewHolder holder, final int position) {
    final User1 user = mUser.get(position);
    holder.mfirstNameTextView.setText(user.getFirst());
    holder.msecondNameTextView.setText(user.getSecond());
    holder.mnumberTextView.setText(user.getNumber());
    holder.mgenderTextView.setText(user.getGender());
    holder.mEmailTextView.setText(user.getEmail());
    holder.mDateTextView.setText(user.getDate());
    holder.mTypeTextView.setText(user.getType());
    holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mCallback.onEdit(user);
        }
    });

}

public void remove(User1 user) {
    //TODO: Remove the next line(s) and use Firebase instead
   userref.child(user.getKey()).removeValue();
}


@Override
public int getItemCount() {
    if(mUser==null){
        Log.v("LOG","Warn, null filteredData");
        return 0;
    }else{
        return mUser.size();
    }
}

public void add(User1 user) {
    //TODO: Remove the next line(s) and use Firebase instead
    userref.push().setValue(user);

}

public void update(User1 user, String newFirst,String newSecond, String newNumber, String newGender,String newDate) {
    //TODO: Remove the next line(s) and use Firebase instead
    user.setFirst(newFirst);
    user.setSecond(newSecond);
    user.setNumber(newNumber);
    user.setGender(newGender);
    user.setDate(newDate);
    userref.child(user.getKey()).setValue(user);
}

public interface Callback {
    public void onEdit(User1 user);
}

class ViewHolder extends RecyclerView.ViewHolder {
    private TextView mfirstNameTextView;
    private TextView msecondNameTextView;
    private TextView mnumberTextView;
    private TextView mgenderTextView;
    private TextView mEmailTextView;
    private TextView mDateTextView;
    private TextView mTypeTextView;

    public ViewHolder(View itemView) {
        super(itemView);
        mfirstNameTextView = (TextView) itemView.findViewById(R.id.firstnameTxt);
        msecondNameTextView = (TextView) itemView.findViewById(R.id.lastnameTxt);
        mnumberTextView = (TextView) itemView.findViewById(R.id.numberTxt);
        mgenderTextView = (TextView) itemView.findViewById(R.id.genderTxt);
        mEmailTextView = (TextView) itemView.findViewById(R.id.emailTxt);
        mDateTextView = (TextView) itemView.findViewById(R.id.dateTxt);
        mTypeTextView = (TextView) itemView.findViewById(R.id.typeTxt);
    }
}

我的片段代码

public class memberFragment extends Fragment implements MemberDetailAdapter.Callback, SearchView.OnQueryTextListener {
private ListView mylistView;
private DatabaseReference db;
private Firebasehelper helper;
private CustomAdapter adapter;
private ListView lv;
private com.google.firebase.ikuzou.database.MemberDetailAdapter mAdapter;


public memberFragment() {
    // Required empty public constructor
}



@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    final View view = inflater.inflate(R.layout.fragment_member2, container, false);
    mAdapter = new com.google.firebase.ikuzou.database.MemberDetailAdapter(this);
    setHasOptionsMenu(true);
    RecyclerView view1 = (RecyclerView) view.findViewById(R.id.recycler_view);
    view1.setLayoutManager(new LinearLayoutManager(getContext()));
    view1.setHasFixedSize(true);
    view1.setAdapter(mAdapter);
    return view;
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.search_menu, menu);
    MenuItem searchItem = menu.findItem(R.id.action_search);
    SearchView searchView = (SearchView) searchItem.getActionView();
    searchView.setOnQueryTextListener(this);
    super.onCreateOptionsMenu(menu, inflater);

    super.onCreateOptionsMenu(menu, inflater);
}

private void showAddEditDialog(final User1 user) {
    AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
    builder.setTitle(getString(user == null ? R.string.dialog_add_title : R.string.dialog_edit_title));
    View view = getLayoutInflater().inflate(R.layout.input_dialog, null, false);
    builder.setView(view);
    final EditText firstnameEditText = (EditText) view.findViewById(R.id.firstnameEditText);
    final EditText secondnameEditText = (EditText) view.findViewById(R.id.secondnameEditText);
    final EditText numberEditText = (EditText) view.findViewById(R.id.numberEditText);
    final EditText genderEditText = (EditText) view.findViewById(R.id.genderEditText);
    final EditText emailEditText = (EditText) view.findViewById(R.id.emailEditText);
    final EditText dateEditText = (EditText) view.findViewById(R.id.dateEditText);
    final TextView typeEditText = (TextView) view.findViewById(R.id.typeEditText);
    if (user != null) {
        // pre-populate
        firstnameEditText.setText(user.getFirst());
        secondnameEditText.setText(user.getSecond());
        numberEditText.setText(user.getNumber());
        genderEditText.setText(user.getGender());
        emailEditText.setText(user.getEmail());
        dateEditText.setText(user.getDate());
        typeEditText.setText(user.getType());

        TextWatcher textWatcher = new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                // empty
            }

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

            @Override
            public void afterTextChanged(Editable s) {
                String firstname = firstnameEditText.getText().toString();
                String secondname = secondnameEditText.getText().toString();
                String number = numberEditText.getText().toString();
                String gender = genderEditText.getText().toString();
                String date = dateEditText.getText().toString();
                mAdapter.update(user, firstname,secondname,number,gender,date );
            }
        };

        firstnameEditText.addTextChangedListener(textWatcher);
        secondnameEditText.addTextChangedListener(textWatcher);
        numberEditText.addTextChangedListener(textWatcher);
        genderEditText.addTextChangedListener(textWatcher);
        emailEditText.addTextChangedListener(textWatcher);
        dateEditText.addTextChangedListener(textWatcher);
    }

    builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            if (user == null) {
                String firstname = firstnameEditText.getText().toString();
                String secondname = secondnameEditText.getText().toString();
                String number = numberEditText.getText().toString();
                String gender = genderEditText.getText().toString();
                String email = emailEditText.getText().toString();
                String date = dateEditText.getText().toString();
                mAdapter.add(new User1(firstname,secondname,number,gender, date, email));
            }
        }
    });
    builder.setNegativeButton(android.R.string.cancel, null);

    builder.create().show();


    // Inflate the layout for this fragment



}


@Override
public void onEdit(final User1 user) {
    showAddEditDialog(user);
}

@Override
public boolean onQueryTextSubmit(String query) {
    mAdapter.getFilter().filter(query);

    return false;
}

@Override
public boolean onQueryTextChange(String query) {
    mAdapter.getFilter().filter(query);
    return false;
}

在所有这一切发生之前,我有一个

  

java.lang.NullPointerException:尝试调用接口方法&#39; int java.util.List.size()&#39;

但是将我的getItemcount改为

 public int getItemCount() {
    if(mUser==null){
        Log.v("LOG","Warn, null filteredData");
        return 0;
    }else{
        return mUser.size();
    }
}

 public int getItemCount() {
        return mUser.size();

}

解决了问题。

0 个答案:

没有答案