【问题标题】:how to filter the recycler view using search view如何使用搜索视图过滤回收站视图
【发布时间】:2021-07-31 10:55:22
【问题描述】:

谁能帮帮我。我在过滤回收站视图时遇到问题,我的应用顶部有一个搜索视图,我只想过滤三轮车号码。我有 4 个字符串数组列表,每个都有值。问题是我不知道如何只过滤三轮车号码我尝试了很多东西但我真的不知道,你能帮我吗?这是我的驱动程序列表适配器代码

    public class DriverListAdapter extends RecyclerView.Adapter<DriverListAdapter.ViewHolder> implements Filterable{


private ArrayList<String> mNickNames = new ArrayList<>();
private ArrayList<String> mPhoneNumber = new ArrayList<>();
private ArrayList<String> mTricycleNumber = new ArrayList<>();
private ArrayList<String> mImageUrls = new ArrayList<>();
private Context context;

private List<String> mNickNamesAll;
private List<String> mPhoneNumberAll;
private List<String> mTricycleNumberAll;
private List<String> mImageUrlsAll;


public DriverListAdapter(BookingActivity bookingActivity, ArrayList<String> nickNames, ArrayList<String> phoneNumbers, ArrayList<String> mTricycleNumber, ArrayList<String> images){
    //this.driverList = driverList;
    this.context = bookingActivity;
    this.mNickNames = nickNames;
    this.mPhoneNumber = phoneNumbers;
    this.mTricycleNumber = mTricycleNumber;
    this.mImageUrls = images;
    //this.mUserID = userId;

    mNickNamesAll = new ArrayList<>(nickNames);
    mPhoneNumberAll = new ArrayList<>(phoneNumbers);
    mTricycleNumberAll = new ArrayList<>(mTricycleNumber);
    mImageUrlsAll = new ArrayList<>(images);

}


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

@Override
public void onBindViewHolder(@NonNull DriverListAdapter.ViewHolder holder, final int position) {


    Glide.with(context)
            .asBitmap()
            .load(mImageUrls.get(position))
            .into(holder.imageView);

    holder.tvNickName.setText(mNickNames.get(position));
    holder.tvPhoneNumber.setText(mPhoneNumber.get(position));
    holder.tvTricycleNumber.setText(mTricycleNumber.get(position));
    holder.tvLine.setText("_____________________________________");


    holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            bookDialog(mTricycleNumber.get(position), mNickNames.get(position));
        }
    });

    holder.imageView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(context, "Welcome to Driver Profile", Toast.LENGTH_SHORT).show();
            Intent intent = new Intent(context, DriverProfileActivity.class);
            intent.putExtra("image_url", mImageUrls.get(position));
            intent.putExtra("tricycle_number", mTricycleNumber.get(position));
            context.startActivity(intent);
            //finish();
        }
    });

}

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

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

Filter filter = new Filter() {
    @Override
    protected FilterResults performFiltering(CharSequence constraint) {
        List<String> filteredList = new ArrayList<>();

        if (constraint == null || constraint.length() == 0) {
            filteredList.addAll(mNickNamesAll);
            filteredList.addAll(mPhoneNumberAll);
            filteredList.addAll(mTricycleNumberAll);
            filteredList.addAll(mImageUrlsAll);
        } else {
            for (String nicknames: mNickNamesAll) {
                if (nicknames.toLowerCase().contains(constraint.toString().toLowerCase())) {
                    filteredList.add(nicknames);
                }
            }
            for (String phonenumbers: mPhoneNumberAll){
                if (phonenumbers.toLowerCase().contains(constraint.toString().toLowerCase())) {
                    filteredList.add(phonenumbers);
                }
            }
            for (String tricyclenumber: mTricycleNumberAll){
                if (tricyclenumber.toLowerCase().contains(constraint.toString().toLowerCase())) {
                    filteredList.add(tricyclenumber);
                }
            }
            for (String imageUrl: mImageUrlsAll){
                if (imageUrl.toLowerCase().contains(constraint.toString().toLowerCase())) {
                    filteredList.add(imageUrl);
                }
            }
        }

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

    @Override
    protected void publishResults(CharSequence constraint, FilterResults results) {
        mTricycleNumber.clear();
        mNickNames.clear();
        mPhoneNumber.clear();
        mImageUrls.clear();

        mNickNames.addAll((Collection<? extends String>) results.values);
        mPhoneNumber.addAll((Collection<? extends String>) results.values);
        mTricycleNumber.addAll((Collection<? extends String>) results.values);
        mImageUrls.addAll((Collection<? extends String>) results.values);

        notifyDataSetChanged();
    }
};


public class ViewHolder extends RecyclerView.ViewHolder{

    private CircleImageView imageView;
    private TextView tvNickName;
    private TextView tvPhoneNumber;
    private TextView tvTricycleNumber;
    private TextView tvLine;

    public ViewHolder(View itemView) {
        super(itemView);
        imageView = itemView.findViewById(R.id.imageview);
        tvNickName = itemView.findViewById(R.id.tv_nick_name);
        tvPhoneNumber = itemView.findViewById(R.id.tv_phone_number);
        tvTricycleNumber = itemView.findViewById(R.id.tv_tricycle_number);
        tvLine = itemView.findViewById(R.id.tv_line);
    }
}

private void bookDialog(final String tricyclenumber, final String tricyclenickname){
    AlertDialog.Builder builder = new AlertDialog.Builder(
            context
    );
    builder.setIcon(R.drawable.ic_baseline_check_circle_24);
    builder.setTitle("Book Tricycle:");
    builder.setMessage("Tricycle Number " + tricyclenumber + " You What To Book This Tricycle?");
    builder.setCancelable(false);
    builder.setPositiveButton("No", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            dialog.cancel();
        }
    });
    builder.setNegativeButton("Yes", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            //firestore insert data!
            Toast.makeText(context, "Welcome to Book Transaction Activity", Toast.LENGTH_SHORT).show();
            Intent intent = new Intent(context, BookTransactionActivity.class);
            intent.putExtra("tricycle_number", tricyclenumber);
            intent.putExtra("tricycle_nickname", tricyclenickname);
            context.startActivity(intent);


        }
    });
    AlertDialog alertDialog = builder.create();
    alertDialog.show();
}}

这是搜索视图的代码。

     svSearch.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {
            return false;
        }

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

【问题讨论】:

标签: android android-recyclerview searchview


【解决方案1】:

过滤器中的适配器

 private void filter(String text) {
    //new array list that will hold the filtered data
    ArrayList<String> filterdNames = new ArrayList<>();

    //looping through existing elements
    for (String s : names) {
        //if the existing elements contains the search input
        if (s.toLowerCase().contains(text.toLowerCase())) {
            //adding the element to filtered list
            filterdNames.add(s);
        }
    }

    //calling a method of the adapter class and passing the 
     filtered list 
    adapter.filterList(filterdNames);
}


 public void filterList(ArrayList<String> filterdNames) {
    this.names = filterdNames;
    notifyDataSetChanged();
}

这是我使用 edittext 进行搜索的代码,这是我的应用程序,你也可以获得帮助

   editTextSearch.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

        }

        @Override
        public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

        }

        @Override
        public void afterTextChanged(Editable editable) {
            //after the change calling the method and passing the search input
            filter(editable.toString());
        }
    });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-18
    相关资源
    最近更新 更多