Android自定义PopupWindow实现流式布局筛选控件(二)

前言:在上一篇文章中介绍了自定义PopupWindow实现流式布局效果的筛选控件,基本的效果已经实现。但本人在项目中使用时发现了一个小Bug(可能也不算bug,不过使用返回的筛选条件时可能会麻烦点,需要自己设置未点击的tab对应的请求参数,如果未作处理就会默认上次的请求参数),就是在自定义PopupWindow的监听接口返回数据时,未被点击的tab不会添加数据到返回的数据列表中,即不会添加默认选中的各tab“不限”数据。

1.bug修复

(1)将之前的默认选中第一项代码

//设置默认选中第一个
if (i==0) {
    //每个tab的第一个设置为选中
    label.setSelected(true);
    //记录选中的tab值
    model.setTab(tab);
}

替换为:红色部分

//设置默认选中第一个
if (i==0) {
    //每个tab的第一个设置为选中
    label.setSelected(true);
    //记录选中的tab值
    model.setTab(tab);
    //新增未点击筛选条件,返回默认的各tab的"不限"选项
    labelLists.add(model.getTypeName()+"-"+tab.name);
}

(2)将之前各tab的label标签点击事件中的代码

if (tab != model.getTab()){
   Log.e("rcw","index--->"+getIndex(model,labelIndex));
   //清空上次选中的状态
   mGridLayout.getChildAt(getIndex(model,labelIndex)).setSelected(false);
   //设置当前点击选中的tab值
   model.setTab(tab);
   label.setSelected(true);
   String labelText=label.getText().toString();
   labelLists.add(model.getTypeName()+"-"+labelText);
   Log.e("rcw","labelText--->"+model.getTypeName()+"-"+labelText);
}
替换为:

if (tab != model.getTab()){
    Log.e("rcw","index--->"+getIndex(model,labelIndex));
    //清空上次选中的状态
    mGridLayout.getChildAt(getIndex(model,labelIndex)).setSelected(false);
    //设置当前点击选中的tab值
    model.setTab(tab);
    label.setSelected(true);
    String labelText=label.getText().toString();
    //解决tab未被点击时 ,不添加默认的“不限”数据到集合中
    int flag=-1;//用于记录需要替换的位置
    for (int i=0;i<labelLists.size();i++){
        String tvDes=labelLists.get(i);
        //判断当前集合中是否包含TypeName
        if (tvDes.contains(model.getTypeName())){
            flag=i;
        }
    }
    if (flag!=-1){
        //先删除返回数据集合中的之前选中的
        labelLists.remove(flag);
        //添加当前选中的数据到集合
        labelLists.add(flag,model.getTypeName()+"-"+labelText);
    }
    //labelLists.add(model.getTypeName()+"-"+labelText);
    Log.e("rcw","labelText--->"+model.getTypeName()+"-"+labelText);
}

2.设置不默认选中

由于公司项目设计时要求每次进入筛选时都默认选中"不限"(可能你们叫“全部”或其它等),也许你们可能要求每次进入筛选条件选择时,记录上次选中的位置,你只需要注释掉和添加以下代码即可。

(1)需要注释掉的代码(addTabs方法中)

扫描二维码关注公众号,回复: 1541120 查看本文章
//设置默认选中第一个
if (i==0) {
  //每个tab的第一个设置为选中
  label.setSelected(true);
   //记录选中的tab值
   model.setTab(tab);
}

(2)添加代码处(addTabs方法中):红色部分为添加代码

//记录上次选中状态
if (tabs.get(i) == model.getTab()){
    label.setSelected(true);
    labelLists.add(model.getTypeName()+"-"+tab.name);
}

(3)修改添加代码处(addTabs方法中的label标签的点击事件中)

if (tab != model.getTab()){
    Log.e("rcw","index--->"+getIndex(model,labelIndex));
    //清空上次选中的状态
    mGridLayout.getChildAt(getIndex(model,labelIndex)).setSelected(false);
    //设置当前点击选中的tab值
    model.setTab(tab);
    label.setSelected(true);
    String labelText=label.getText().toString();
    //解决tab未被点击时 ,不添加默认的“不限”数据到集合中
    int flag=-1;//用于记录需要替换的位置
    if (labelLists.size()!=0){
        for (int i=0;i<labelLists.size();i++){
            String tvDes=labelLists.get(i);
            //判断当前集合中是否包含TypeName
            if (tvDes.contains(model.getTypeName())){
                flag=i;
                break;//匹配成功,跳出循环
            }else {
                flag=-1;
            }
        }
        if (flag!=-1){
            //先删除返回数据集合中的之前选中的
            labelLists.remove(flag);
            //添加当前选中的数据到集合
            labelLists.add(flag,model.getTypeName()+"-"+labelText);
        }else {
            labelLists.add(model.getTypeName()+"-"+labelText);
        }
    }else {
        labelLists.add(model.getTypeName()+"-"+labelText);
    }

    //labelLists.add(model.getTypeName()+"-"+labelText);
    Log.e("rcw","labelText--->"+model.getTypeName()+"-"+labelText);
}

注:以上代码的增删都是在上一篇文章的代码基础上进行的操作。

如有任何疑问,欢迎留言及评论,谢谢!!!


猜你喜欢

转载自blog.csdn.net/ruancw/article/details/80556413