您好我可以问为什么我的搜索视图在搜索片段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();
}
解决了问题。