拥有筛选功能的底部弹出框

这里使用了BottomSheetDialog,需要在app的.gradle中依赖implementation'com.google.android.material:material:1.0.0'

我们创建一个bean对象,里面的数据必须实现 Cloneable, Parcelable ,并添加成员变量 public CharSequence   s;  这个s要在数据生成好后初始化好,并赋值在adapter中显示的内容,作为筛选之用。


public class SelectedBeanimplements Cloneable, Parcelable {

public Stringname;

public Stringcode;

public CharSequences;

public SelectedBean(String name, String code) {

this.name = name;

this.code = code;

}

@Override

    public int describeContents() {

return 0;

}

@Override

    public void writeToParcel(Parcel dest,int flags) {

dest.writeString(this.name);

dest.writeString(this.code);

}

public SelectedBean() {

}

protected SelectedBean(Parcel in) {

this.name = in.readString();

this.code = in.readString();

}

public static final Parcelable.CreatorCREATOR =new Parcelable.Creator() {

@Override

        public SelectedBean createFromParcel(Parcel source) {

return new SelectedBean(source);

}

@Override

        public SelectedBean[] newArray(int size) {

return new SelectedBean[size];

}

};

@Override

    public SelectedBean clone()throws CloneNotSupportedException {

return (SelectedBean)super.clone();

}

}


//初始化bean数据:


list.add(new SelectedBean("北京",0+""));

list.add(new SelectedBean("上海",1+""));

list.add(new SelectedBean("广州",2+""));

list.add(new SelectedBean("深证",3+""));

list.add(new SelectedBean("杭州",4+""));

list.add(new SelectedBean("南京",5+""));

list.add(new SelectedBean("合肥",6+""));

list.add(new SelectedBean("苏州",7+""));

list.add(new SelectedBean("武汉",8+""));

list.add(new SelectedBean("无锡",9+""));

list.add(new SelectedBean("芜湖",10+""));

for (int i=0;i

//给s赋值

    SelectedBean selectedBean =list.get(i);

selectedBean.s = selectedBean.name;//将名字同时赋值给s

}



然后是底部弹出的dialog

public class SelectedDialogextends BottomSheetDialogimplements View.OnClickListener, DialogInterface.OnDismissListener {

private ListmList;

private OnListenermListener;

private SelectedAdapterselectedAdapter;

private EditTextetSearch;

private TextViewtvFinish;

private RecyclerViewrecyclerView;

public SelectedDialog(@NonNull Context context, List list,OnListener mListener) {

super(context);

mList = list;

this.mListener = mListener;

View view = LayoutInflater.from(context).inflate(R.layout.dialog_bottom_sheet,null);

initView(view);

setContentView(view);

View parent = (View) view.getParent();

parent.setBackgroundColor(getContext().getResources().getColor(android.R.color.transparent));

BottomSheetBehavior behavior = BottomSheetBehavior.from(parent);

//这里最好采用灵活高低,不要写死

        behavior.setPeekHeight(640);

setOnDismissListener(this);

SoftKeyboardStateHelper softKeyboardStateHelper =new SoftKeyboardStateHelper(view);

softKeyboardStateHelper.addSoftKeyboardStateListener(new SoftKeyboardStateHelper.SoftKeyboardStateListener() {

@Override

            public void onSoftKeyboardOpened(int keyboardHeightInPx) {

//键盘打开

                tvFinish.setVisibility(View.VISIBLE);

}

@Override

            public void onSoftKeyboardClosed() {

tvFinish.setVisibility(View.VISIBLE);

}

});

}

private void initView(View view) {

etSearch = view.findViewById(R.id.search_et);

tvFinish = view.findViewById(R.id.finish_tv);

recyclerView = view.findViewById(R.id.recyclerView);

tvFinish.setOnClickListener(this);

view.findViewById(R.id.cancel).setOnClickListener(this);

recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));

selectedAdapter =new SelectedAdapter(mListener);

selectedAdapter.setData(mList);

recyclerView.setAdapter(selectedAdapter);

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

selectedAdapter.getFilter().filter(s.toString());

}

@Override

            public void afterTextChanged(Editable s) {

}

});

}

@Override

    public void onClick(View v) {

switch (v.getId()) {

case R.id.cancel:

dismiss();

break;

case R.id.finish_tv:


                InputMethodManager imm = (InputMethodManager) UIUtil.getAppContext().getSystemService(Context.INPUT_METHOD_SERVICE);

if (imm !=null) {

imm.hideSoftInputFromWindow(etSearch.getWindowToken(),0);

}

//并将显示的数据还原,这里数据顺序不能反了

                selectedAdapter.setData(mList);

etSearch.setText("");

break;

}

}

@Override

    public void onDismiss(DialogInterface dialogInterface) {

//关闭dialog的回调

        selectedAdapter.setData(mList);

etSearch.setText("");

}

public SelectedDialog(@NonNull Context context,int theme) {

super(context, theme);

}

protected SelectedDialog(@NonNull Context context,boolean cancelable, OnCancelListener cancelListener) {

super(context, cancelable, cancelListener);

}

public interface OnListener {

void onPicked(SelectedBean selectedBean);

}


然后是adapter  ,这个adapter要实现implements Filterable,这个是筛选的关键,并在public Filter getFilter() {}这个方法中写筛选的逻辑,

public class SelectedAdapterextends RecyclerView.Adapterimplements Filterable {

private ListmList ;

private ListmFilterData =new ArrayList<>()  ;

private SelectedDialog.OnListenermListener;

private SelectedBeanmSelectedBean;

public SelectedAdapter(SelectedDialog.OnListener listener) {

this.mListener= listener;

}

public void setData(List data) {

mList = data;

mFilterData = data;

notifyDataSetChanged();

}

@NonNull

@Override

    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent,int viewType) {

View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_selected,parent,false);

return new MyViewHolder(view);

}

@Override

    public void onBindViewHolder(@NonNull MyViewHolder holder,int position) {

SelectedBean bean =mFilterData.get(position);

holder.tvName.setText(bean.s);

holder.tvName.setSelected(mSelectedBean !=null && TextUtils.equals(bean.code,mSelectedBean.code));

if (mSelectedBean !=null && TextUtils.equals(bean.code,mSelectedBean.code)) {

//选中的右边加一个选中符号,

            holder.tvName.setCompoundDrawablesWithIntrinsicBounds(0,0, R.drawable.icon_selected,0);

}else {

holder.tvName.setCompoundDrawablesWithIntrinsicBounds(0,0,0,0);

}

}

@Override

    public int getItemCount() {

return mFilterData ==null ?0 :mFilterData.size();

}

@Override

    public Filter getFilter() {

return new Filter() {

@Override

            protected FilterResults performFiltering(CharSequence charSequence) {

if (TextUtils.isEmpty(charSequence)){

//没有过滤内容,使用原数据

                }else {

//创建新集合

                    List filteredList =new ArrayList<>();

for (SelectedBean bean:mList){

//判断我们的名字之中是否包含charSequence(输入的字段)

                      if (bean.s.toString().contains(charSequence)){

SpannableString ss =new SpannableString(bean.s);

//检测到相同的文字,就显示红色

                          ForegroundColorSpan foregroundColorSpan =new ForegroundColorSpan(Color.parseColor("#ff0000"));

//输入的字符长度范围

                          int start =bean.s.toString().indexOf(charSequence.toString());

int end = start+charSequence.length();

ss.setSpan(foregroundColorSpan,start,end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

try {

bean = bean.clone();

bean.s = ss;

}catch (CloneNotSupportedException e){

e.printStackTrace();

}

filteredList.add(bean);//将包含的数据添加到过滤的集合中

                      }

}

mFilterData = filteredList;

}

FilterResults filterResults =new FilterResults();

filterResults.values =mFilterData;

return filterResults;

}

@Override

            protected void publishResults(CharSequence charSequence, FilterResults filterResults) {

mFilterData = (List) filterResults.values;//将最新的过滤的集合,显示在页面上

                notifyDataSetChanged();

}

};

}

class MyViewHolderextends RecyclerView.ViewHolderimplements View.OnClickListener{

TextViewtvName;

public MyViewHolder(@NonNull View itemView) {

super(itemView);

tvName = itemView.findViewById(R.id.tv_name);

itemView.setOnClickListener(this);

}

@Override

        public void onClick(View view) {

int position = getAdapterPosition();

SelectedBean bean =mFilterData.get(position);

if (mListener !=null) {

if (mSelectedBean == bean) {

mSelectedBean =null;

}else {

mSelectedBean = bean;

}

mListener.onPicked(mSelectedBean);

}

notifyDataSetChanged();

}

}

}



//创建并回调:在activity或者fragment中

tvStart.setOnClickListener(new View.OnClickListener() {

@Override

    public void onClick(View view) {

if (selectedDialog ==null){

selectedDialog =new SelectedDialog(MainActivity.this,list,new SelectedDialog.OnListener() {

@Override

                public void onPicked(SelectedBean selectedBean) {

if (selectedBean !=null) {

tvResult.setText(selectedBean.name);

}else {

tvResult.setText("选择城市");

}

selectedDialog.dismiss();

}

});

}

selectedDialog.show();

}

});





©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,658评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,482评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,213评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,395评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,487评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,523评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,525评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,300评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,753评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,048评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,223评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,905评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,541评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,168评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,417评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,094评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,088评论 2 352

推荐阅读更多精彩内容