简体   繁体   中英

Recycler view filter is not giving desired result in android

I am using a recycler view with a filter. When I load the data into the recycler view the first time, it gives me a perfect result, but when I use the search option, it is not giving me the result I wanted.

I want to show an activate button when the user field status is deactivated in the database, and show a deactivate button when the user field status is activated in the database. However, after performing the search it's not happening.

This image is giving me perfect result when I load first-time recycler view:
当我加载第一次回收站视图时,这张图片给了我完美的结果

This image after search result but not giving the result I wanted:
搜索结果后的这张图片,但没有给出我想要的结果

Below is my adapter class

    private final Context mContext;
    private final List<UserHelperClass> mFilteredList;
    private final List<UserHelperClass> mDataList;

    public User_Control_adapter_class(Context mContext,List<UserHelperClass> mFilteredList) {
        this.mContext=mContext;
        this.mFilteredList = mFilteredList;
        mDataList = new ArrayList<>(mFilteredList);
    }

    @Override
    public Filter getFilter() {
        return filteredList;
    }

    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View rootView = LayoutInflater.from(parent.getContext()).inflate(R.layout.user_control_single_row, parent, false);
        return new MyViewHolder(rootView);
    }

    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
        final UserHelperClass userHelperClass = mFilteredList.get(position);

        holder.fullname.setText(userHelperClass.getFullname());
        holder.aadhar.setText(userHelperClass.getUsername());
        holder.stationid.setText(userHelperClass.getStationid());
        holder.contactno.setText(userHelperClass.getContactno());


        if (userHelperClass.getStatus().equals("Active")) {
            holder.activate.setVisibility(View.GONE);
        } else {
            holder.deactivate.setVisibility(View.GONE);
        }

    holder.copy.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            ClipboardManager clipboard = (ClipboardManager)mContext.getSystemService(Context.CLIPBOARD_SERVICE);
            ClipData clip = ClipData.newPlainText(userHelperClass.getUsername(), userHelperClass.getUsername());
            Toast.makeText(mContext, userHelperClass.getUsername()+ " Copied Successfully", Toast.LENGTH_SHORT).show();
            clipboard.setPrimaryClip(clip);
        }
    });

    holder.call.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + userHelperClass.getContactno()));
            mContext.startActivity(intent);



        }
    });

    }

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

    private final Filter filteredList = new Filter() {
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            List<UserHelperClass> filterlist = new ArrayList<>();
            if (constraint == null || constraint.length() == 0) {
                filterlist.addAll(mDataList);
            } else {
                String pattern = constraint.toString().toLowerCase().trim();
                for (UserHelperClass item : mDataList) {
                    if (item.getFullname().toLowerCase().contains(pattern)) {
                        filterlist.add(item);
                    }
                }
            }
            FilterResults filterResults = new FilterResults();
            filterResults.values = filterlist;
            return filterResults;
        }

        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            mFilteredList.clear();
            mFilteredList.addAll((List) results.values);
            notifyDataSetChanged();
        }
    };


    static class MyViewHolder extends RecyclerView.ViewHolder {

        TextView fullname, aadhar, contactno, stationid;
        Button activate, deactivate, viewEOD, viewCertificate, copy;
        ImageButton call;

        public MyViewHolder(@NonNull View itemView) {
            super(itemView);
            fullname = itemView.findViewById(R.id.user_control_single_name);
            aadhar = itemView.findViewById(R.id.user_control_single_aadhar);
            contactno = itemView.findViewById(R.id.user_control_single_contact);
            stationid = itemView.findViewById(R.id.user_control_single_stationid);

            activate = itemView.findViewById(R.id.user_control_active_button);
            deactivate = itemView.findViewById(R.id.user_control_deactive_button);
            viewEOD = itemView.findViewById(R.id.user_control_View_EOD_button);
            viewCertificate = itemView.findViewById(R.id.user_control_certificate_button);
            copy = itemView.findViewById(R.id.copy_button);

            call = itemView.findViewById(R.id.call_button);

        }
    }
}

Below is my User_control class

    public class User_Control extends AppCompatActivity {
    Toolbar toolbar;
    ProgressBar progressBar;
    private List<UserHelperClass> mDataList=new ArrayList<>();
    private User_Control_adapter_class mRecyler_View_User_Control_Adapter;
    TextInputLayout searchText;
    String search_string;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_user__control);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

        toolbar = findViewById(R.id.custome_toolbar);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            setActionBar(toolbar);
        }

        searchText=findViewById(R.id.textlayout_search_layout_user_control);
        search_string= Objects.requireNonNull(searchText.getEditText()).toString().trim();


        progressBar = (ProgressBar) findViewById(R.id.spin_kit);
        Sprite fadingCircle = new Circle();
        progressBar.setIndeterminateDrawable(fadingCircle);
        progressBar.setVisibility(View.VISIBLE);



        getUserInformation();

        searchText.getEditText().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) {

                mRecyler_View_User_Control_Adapter.getFilter().filter(s);

            }
        });

    }
    //end of OnCreate



    private void getUserInformation() {
        DatabaseReference mRef= FirebaseDatabase.getInstance().getReference("Users");
        mRef.orderByChild("username").addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                for (DataSnapshot snapshot1:snapshot.getChildren())
                {
                    if (snapshot1.exists())
                    {
                        UserHelperClass userHelperClass=snapshot1.getValue(UserHelperClass.class);
                        assert userHelperClass !=null;
                        if(!userHelperClass.getUsername().equals("1"))
                        {
                            mDataList.add(userHelperClass);
                        }

                    }else
                    {
                        Log.d("Error","No Snapshot exists");}
                }
                RecyclerView mRecylerView = findViewById(R.id.recycler_view_user_control);
                mRecylerView.setHasFixedSize(true);
                RecyclerView.LayoutManager layoutManager=new LinearLayoutManager(User_Control.this);
                mRecyler_View_User_Control_Adapter=new User_Control_adapter_class(User_Control.this,mDataList);
                mRecylerView.setLayoutManager(layoutManager);
                mRecylerView.setAdapter(mRecyler_View_User_Control_Adapter);
                progressBar.setVisibility(View.GONE);
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {
                Log.d("Database Error","Failed to fatch data from the server");
            }
        });
    }
}

Try with this, I think it's working..!

    private final Filter filteredList = new Filter() {
    @Override
    protected FilterResults performFiltering(CharSequence constraint) {
        List<UserHelperClass> filterlist = new ArrayList<>();
        if (constraint == null || constraint.length() == 0) {
            filterlist.addAll(mDataList);
        } else {
            String pattern = constraint.toString().toLowerCase().trim();
            for (UserHelperClass item : mDataList) {
                if (item.getFullname().toLowerCase().contains(pattern) && item.getStatus().equals("Active")) {
                    filterlist.add(item);
                }
            }
        }
        FilterResults filterResults = new FilterResults();
        filterResults.values = filterlist;
        return filterResults;
    }

    @Override
    protected void publishResults(CharSequence constraint, FilterResults results) {
        mFilteredList.clear();
        mFilteredList.addAll((List) results.values);
        notifyDataSetChanged();
    }
};

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM