Android 实现搜索筛选器在按backspace键时导致问题

Android 实现搜索筛选器在按backspace键时导致问题,android,android-recyclerview,android-adapter,Android,Android Recyclerview,Android Adapter,当我第一次输入编辑文本时,我试图在recyclerview中对复杂对象数据实现搜索过滤器,但每当我试图通过按空格删除字符以修改搜索时,我都会在这方面屡屡失败。 我只能搜索一次!! 现在是过滤代码 public void filter(CharSequence sequence) { ArrayList<user> temp = new ArrayList<>(); if (!TextUtils.isEmpty(sequence)) {

当我第一次输入编辑文本时,我试图在recyclerview中对复杂对象数据实现搜索过滤器,但每当我试图通过按空格删除字符以修改搜索时,我都会在这方面屡屡失败。 我只能搜索一次!!

现在是过滤代码

    public void filter(CharSequence sequence) {
    ArrayList<user> temp = new ArrayList<>();
        if (!TextUtils.isEmpty(sequence)) {
            for (user s : arr) {
                Log.d("users ",s.getName());
                if (s.getName().toLowerCase().contains(sequence)) {
                    temp.add(s);
                }
            }

        } else {
            temp.addAll(arrcopy);
        }
        arr.clear();
        arr.addAll(temp);
        notifyDataSetChanged();
        temp.clear();

}
有什么问题吗?我只能搜索一次感谢任何帮助

这是我的适配器类

    public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyHolder>
{
    Context cxt;
    ArrayList<user> arr;
    ArrayList<user> arrcopy;
    DatabaseReference dref;
    MyAdapter myAdapter;
    public MyAdapter(Context context, ArrayList<user> arrayList)
    {
        cxt = context;
        arr = arrayList;
        arrcopy=new ArrayList<>(arr);
        Log.d("Very start arr",arr.toString());
        notifyDataSetChanged();
        dref = FirebaseDatabase.getInstance().getReference("users");
    }


    @NonNull
    @Override
    public MyHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(cxt).inflate(R.layout.item_chatroom,viewGroup,false);
        myAdapter = new MyAdapter(cxt, arr);
        Log.d("Inside MyHolder arr",arr.toString());
        return new MyHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull final MyHolder myHolder,final int i) {

        final String name = arr.get(i).getUsername();
        String pic=arr.get(i).getPic();
        final String mail=arr.get(i).getEmail();
        myHolder.name.setText(name);



        Glide.with(myHolder.profile.getContext())
                .load(pic)
                .into(myHolder.profile);

        myHolder.name.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(cxt,MainActivity.class);
                intent.putExtra("Id",arr.get(i).getId());
                intent.putExtra("Name",arr.get(i).getUsername());
                cxt.startActivity(intent);
            }
        });

        myHolder.info.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                final SweetAlertDialog pDialog = new SweetAlertDialog(cxt, SweetAlertDialog.SUCCESS_TYPE);
                pDialog.setTitleText("User Information e-mail ID");
                pDialog.setContentText("Name: "+name+"\n\n E-mail: "+mail);
                pDialog.setConfirmText("Ok");
                pDialog.show();
            }
        });
    }

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

    class MyHolder extends RecyclerView.ViewHolder
    {
        TextView name;
        ImageView profile,info;
        public MyHolder(@NonNull View itemView) {
            super(itemView);
            name = itemView.findViewById(R.id.txv);
            profile=itemView.findViewById(R.id.profile);
            info=itemView.findViewById(R.id.profileinfo);
        }
    }

    public void filter(CharSequence sequence) {

        ArrayList<user> temp = new ArrayList<>();
            if (!TextUtils.isEmpty(sequence)) {
                for (user s : arr) {
                    if (s.getName().toLowerCase().contains(sequence)) {
                        temp.add(s);
                    }
                }

            } else {
                temp.addAll(arrcopy);

            }
            arr.clear();
            arr.addAll(temp);

            notifyDataSetChanged();
            temp.clear();

    }

}

我假设arrcopy是arr的副本,如:

ArrayList<User> arrcopy = new ArrayList<>(arr);
现在temp为空,为适配器设置的arr数据为空,因此会出现问题。 请尝试: 在MyAdapter中:

Context cxt;
ArrayList<user> arr;
public MyAdapter(Context context) {
    cxt = context;
    dref = FirebaseDatabase.getInstance().getReference("users");
}

public void setData(ArrayList<User> arrayList) {
    arr = arrayList;
    notifyDataSetChanged();
}
还要将过滤器放入活动/片段中:

protected void onCreate(final Bundle savedInstanceState) {
    etSearch = (EditText) findViewById(R.id.edittext);
    etSearch.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            etSearch.requestFocus();
        }
    });
    etSearch.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) {
                filter(etSearch.getText().toString());
        }

        @Override
        public void afterTextChanged(Editable s) {
        }
    });
    etSearch.clearFocus();

    mAdapter = new MyAdapter(this);
    mAdapter.setData(arrayList);
    mRecyclerView.setAdapter(mAdapter);
    ...
}

public void filter(String input) {
    if (!TextUtils.isEmpty(input)) {
        ArrayList<User> temp = new ArrayList<>();
        for (user s : arr) {
            if (s.getName().toLowerCase().contains(input)) {
                temp.add(s);
            }
        }
        mAdapter.setData(temp);
    } else {
        mAdapter.setData(arr);
    }
    mAdapter.notifyDataSetChanged();
}
在MyAdapter中实现Filterable


arrcopy包含哪些内容。过滤器在哪里定义?您能否提供一个可以重现错误的代码?arrcopy只是arr的副本,它是自定义“用户”objectDebug文件服务器的ArrayList,并检查第二次arr是否包含任何数据&更新我。我认为这个问题与分享相同的参考资料有关。此外,您正在清除arr并将temp添加到其中,这样会丢失完整的列表。请参阅,我没有任何setdata方法,如何使用该方法?因此,虽然我可以理解您试图告诉我的内容,但我无法找到一种方法IMPLEMENT@Achy97So如何设置适配器的arr?这就是setData所在的位置。我已经添加了myAdapter类。非常感谢您的努力,但不幸的是它不起作用,nullblank arraylist java.lang.NullPointerException的相同问题:尝试在com.actech.android.frienchat.MyAdapter.setDatajava.util.arraylist的空对象引用上调用虚拟方法“void com.actech.android.frienchat.MyAdapter.java:144 atcom.actech.android.frienchat.ChatList$3.onTextChangedChatList.java:162@Achy97只需在etSearch.addTextChangedListenernew TextWatcher{}Edited之前初始化适配器就可以了。我应该在哪里声明myObjectsMyObject表示您的用户类。我编辑。将myObjects替换为arrNo I是指myObjects,例如myObjects=filteredList;就像你在代码中所做的那样。检查我添加了构造函数。
Context cxt;
ArrayList<user> arr;
public MyAdapter(Context context) {
    cxt = context;
    dref = FirebaseDatabase.getInstance().getReference("users");
}

public void setData(ArrayList<User> arrayList) {
    arr = arrayList;
    notifyDataSetChanged();
}
protected void onCreate(final Bundle savedInstanceState) {
    etSearch = (EditText) findViewById(R.id.edittext);
    etSearch.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            etSearch.requestFocus();
        }
    });
    etSearch.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) {
                filter(etSearch.getText().toString());
        }

        @Override
        public void afterTextChanged(Editable s) {
        }
    });
    etSearch.clearFocus();

    mAdapter = new MyAdapter(this);
    mAdapter.setData(arrayList);
    mRecyclerView.setAdapter(mAdapter);
    ...
}

public void filter(String input) {
    if (!TextUtils.isEmpty(input)) {
        ArrayList<User> temp = new ArrayList<>();
        for (user s : arr) {
            if (s.getName().toLowerCase().contains(input)) {
                temp.add(s);
            }
        }
        mAdapter.setData(temp);
    } else {
        mAdapter.setData(arr);
    }
    mAdapter.notifyDataSetChanged();
}
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyHolder> 
    implements Filterable {
      // change MyObject to user class
      //replace myObjects with arr and reservedList with arrcopy

    Context cxt;
    ArrayList<MyObject> myObjects;
    ArrayList<MyObject> reservedList;
    DatabaseReference dref;


public MyAdapter(Context context, ArrayList<MyObject> arrayList){
        cxt = context;
        myObjects = arrayList;
        reservedList = arrayList
        Log.d("Very start arr",myObjects.toString());
       // notifyDataSetChanged();
        dref = FirebaseDatabase.getInstance().getReference("users");
    }

   //...

@Override
public Filter getFilter() {
    return new Filter() {
        @Override
        protected FilterResults performFiltering(CharSequence charSequence) {
            String charString = charSequence.toString().toLowerCase();
            if (!charString.isEmpty()) {
                List<MyObject> filteredList = new ArrayList<>();
                for (MyObject row : reservedList) {
                    if (row.getName().toLowerCase().contains(charString)){
                        filteredList.add(row);
                    }
                }
                myObjects = filteredList;
            } else {
                myObjects = reservedList;
            }

            FilterResults filterResults = new FilterResults();
            filterResults.values = myObjects;
            return filterResults;
        }

        @Override
        protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
            myObjects = (ArrayList<MyObject>) filterResults.values;
            notifyDataSetChanged();
        }
    };
}
etSearch = (EditText) findViewById(R.id.edittext);

etSearch.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) {

      myAdapter.getFilter().filter(s);

    }

    @Override
    public void afterTextChanged(Editable s) {

    }
});