精华内容
下载资源
问答
  • Laravel开发-eloquent-filterable 雄辩模型的过滤范围
  • filterable ( ) ; 为了使其发挥作用,您的 html 需要进行一些设置。 首先,一个带有复选框的表单,您的用户可以取消选中以隐藏某些行... < form id =" filter-controls " > < input type =" ...
  • AutoCompleteTextView中输入字母或者汉字通过Filterable实现自动筛选提醒
  • Laravel开发-laravel-filterable 用于使用URL查询字符串动态筛选雄辩结果的Laravel包。
  • 原先碰到筛选这种功能时,后端的接口都会让上传一个字段,根据字段来返回相应的数据。后来一次和别人对接时,接口直接返回全部数据,而且还要实现筛选功能。...偶然间看到了Filterable,使Adapter继承自该接口,实现ge.

    原先碰到筛选这种功能时,后端的接口都会让上传一个字段,根据字段来返回相应的数据。后来一次和别人对接时,接口直接返回全部数据,而且还要实现筛选功能。我…我说不就是一条sql语句的事,改接口多方便,我苦心劝导,然后被怼回来,切,不就是筛选嘛,求人不如自己搞。

    1. 效果图

    购物车效果图

    2. 思路

    既然是筛选,那就少不了比较。也没有什么好的办法,无非就是循环对比,然后将适配器进行数据更新。页面刷新即可。但筛选的调用要方便,怎么比较才方便我们调用呢?偶然间看到了Filterable,使Adapter继承自该接口,实现getFilter()方法,在该方法里实现具体的过滤逻辑即可。

    3. 实现步骤

    3.1 数据Bean类

    class MyBean(var type:String,var name:String,var deliverType:String)
    

    这里我们简单的创建个数据Bean类,后面我们的筛选字段是根据type和deliverType来进行筛选。

    3.2 创建适配器

    class MyAdapter(data: MutableList<MyBean>) :
        RecyclerView.Adapter<MyAdapter.MyViewHolder>(), Filterable {
    
        //存放原数据
        private var mSourceList = mutableListOf<MyBean>()
    
        //存放过滤后的数据
        private var mFilterList = mutableListOf<MyBean>()
    
        init {
            mSourceList = data
        }
    
        override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
            holder.name.text = mFilterList[position].name
            holder.deliverType.text = mFilterList[position].deliverType
        }
    
        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
            var view =
                LayoutInflater.from(parent.context).inflate(R.layout.item, parent, false)
            return MyViewHolder(view)
        }
    
        /**
         * 注意:这里返回过滤后的集合大小
         */
        override fun getItemCount(): Int {
            return mFilterList.size
        }
    
        inner class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
            //商品名称
            var name: TextView = itemView.findViewById(R.id.tvName)
            //配送方式
            var deliverType: TextView = itemView.findViewById(R.id.tvDeliverType)
        }
    }
    

    和我们平时创建的Adapter没什么两样。但要注意以下几点

    • 这里我们创建了两个集合mSourceList和mFilterList,mFilterList主要是用来存放过滤后的数据,而mSourceList主要是用来在筛选后数据恢复时使用,使得不用再去请求一次数据。

    • getItemCount()方法返回过滤后的集合的大小。

    有个疑问:

    假如我们没有进行过滤,而因为我们的mFilterList默认为空,且getItemCount()返回的是它的大小0,那我们默认是不是就显示不出数据?

    3.3 继承Filterable接口

    • 继承Filterable接口后,实现其getFilter()方法,该方法需要我们返回一个Filter过滤器对象。

    • 我们重写Filter的performFiltering()方法和publishResults()方法,performFiltering()用来实现我们具体过滤的逻辑操作,publishResults()用来将我们过滤后的数据进行更新。

    • 因为performFiltering()传来的过滤条件是一段字符串,而我们的过滤条件有两个,所以我们将过滤的条件转化为Json对象传过来,那样就可以得到多个过滤条件的字符串了。

    • 这里我们的具体过滤操作是使用Collection的filter()方法进行过滤

      • 当condition1和condition2为空时,返回原数据mSourceList

      • 否则使用filter()方法按条件进行过滤,最后将过滤后的集合赋值给FilterResults()对象的value字段,并将其返回

    • publishResults(charSequence: CharSequence,filterResults: FilterResults)方法中filterResults对象内的value字段是我们performFiltering()方法返回的过滤后的集合,在这里我们将RecyclerView进行更新。

    具体实现见以下代码:

    class MyAdapter(data: MutableList<MyBean>) :
        RecyclerView.Adapter<MyAdapter.MyViewHolder>(), Filterable {
            /**
         * 具体的执行过滤的操作
         * 创建适配器后会默认的执行一次
         */
        override fun getFilter(): Filter {
            return object : Filter() {
                //执行过滤操作
                override fun performFiltering(charSequence: CharSequence): FilterResults {
                    val charString = charSequence.toString()
                    Log.i(TAG, "performFiltering: 执行过滤操作,过滤字段为:$charString")
    
                    val jsonObject = JSONObject(charString)
                    //筛选条件一
                    var condition1 = jsonObject.getString("condition1")
                    //筛选条件二
                    var condition2 = jsonObject.getString("condition2")
    
                    //存放已过滤的数据
                    var theFilterList = if (condition1.isEmpty() && condition2.isEmpty()) {
                        //没有过滤的内容,则使用源数据
                        mSourceList
                    } else if (condition2.isEmpty()) {
                        mSourceList.filter { it.type == condition1 }
                    } else if (condition1.isEmpty()) {
                        mSourceList.filter { it.deliverType == condition2 }
                    } else {
                        mSourceList.filter { it.type == condition1 && it.deliverType == condition2 }
                    }
                    val filterResults = FilterResults()
                    filterResults.values = theFilterList
                    return filterResults
                }
    
                //把过滤后的值返回出来并进行更新
                override fun publishResults(
                    charSequence: CharSequence,
                    filterResults: FilterResults
                ) {
                    mFilterList = filterResults.values as MutableList<MyBean>
                    notifyDataSetChanged()
                }
            }
        }
    }
    

    3.4 过滤调用

    class MainActivity : AppCompatActivity() {
        
        //过滤条件1
        var condition1 = ""
        //过滤条件2
        var condition2 = ""
        //总的过滤条件
        var jsonObject = JSONObject()
        private var dataList = mutableListOf<MyBean>()
        var myAdapter = MyAdapter(dataList)
        
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
            
            mRecyclerView.layoutManager = LinearLayoutManager(this)
            mRecyclerView.adapter = myAdapter
    
            jsonObject.put("condition1","过滤条件一")
            jsonObject.put("condition2","过滤条件二")
            myAdapter.filter.filter(jsonObject.toString())
            
          
        }
    }
    
    

    如果想恢复数据不筛选,直接将jsonObject对象内的condition1和condition2字段设为空,然后调用myAdapter.filter.filter(jsonObject.toString())即可。

    具体见代码

    4. 优化

    其实我们getFilter()内的过滤操作还可以优化下

    var theFilterList = if (condition1.isEmpty() && condition2.isEmpty()) {
        //没有过滤的内容,则使用源数据
        mSourceList
    } else if (condition2.isEmpty()) {
        mSourceList.filter { it.type == condition1 }
    } else if (condition1.isEmpty()) {
        mSourceList.filter { it.deliverType == condition2 }
    } else {
        mSourceList.filter { it.type == condition1 && it.deliverType == condition2 }
    }
    

    可以看到else{}下是当condition1和condition2都不为空的情况下进行的筛选,但是如果我们使用下拉框进行筛选时,选择第一个条件condition1后就已经进行了一次筛选,即condition1不为空condition2为空,在 else if (condition2.isEmpty()){}里对源数据进行了筛选;再选择第二个条件时,又进行了一次筛选,即condition1不为空condition2不为空,在else{}里又是对源数据进行筛选,其实我们应该是在第一次的结果下进行筛选是最优的办法。

    想法很好,但实现起来困难挺多,在两个条件都不为空时,我们需要判断第一次删选下来的数据是以哪个筛选条件为依据的,在两个条件都不为空筛选后,再次更改其中一个筛选条件,我们需要先将另外一个筛选条件下的数据给筛选出来,越来越麻烦,暂时不考虑了,有好的方案的麻烦给个思路。

    5. 注意

    因为Adapter默认返回的大小是筛选后的尺寸,而我们默认是没有筛选的,导致上来会没有数据,所以我们需要设置适配器后,人为的调用一下筛选才好:myAdapter.filter.filter(jsonObject.toString())。而我在项目中没有写因为AppCompatSpinner会默认的选择第0项,我在其onItemSelected()回调里调用了筛选功能。

    6. 总结

    总的来说并不难,还是更新数据更新布局的那一套,不同的是用了Filterable接口实现,使得筛选调用的方式更简单。但是这种实现更多的是适用于数据量小或者固定的数据,如果数据量大,或者数据会一直上拉加载扩充,使用这种方式只会让效率随着数据量的增大而越来越低,显然不合适,下次后端还强硬不改,那就只能开怼了。

    Github项目地址

    7. 参考文章

    集合过滤操作

    Google文档

    展开全文
  • EditText中输入内容,在ListView中筛选出与内容对应的内容。这个效果就相当于是手机通讯录搜索功能,就比如你输入一个联系人的名字,能过滤掉其他联系人,最后显示与你输入相对应的联系人。
  • 希望element所有的下拉框都支持 filterable Element.Select.props.filterable={ type: Boolean, default: true };
    element所有的下拉框都支持 filterable
    import Element from 'element-ui'
    Element.Select.props.filterable={
      type: Boolean,
      default: true
    };
    
    展开全文
  • 匹配,通过添加官方提供的filterable可以实现这种效果: ![图片说明](https://img-ask.csdn.net/upload/202009/04/1599188418_753134.png) 但是官方的filterable对中文搜索的支持不是太好,出现了这种的问题: ...
  • filterable:不支持-源码

    2021-05-03 18:12:33
    Filterable需要和 。 为了能够更改引导程序图标的颜色,请使用“代替默认。 < link href =" ...
  • npx create-react-app filterable-react-list --template typescript --use-npm 可用脚本 在项目目录中,可以运行: npm start 在开发模式下运行应用程序。 打开在浏览器中查看它。 如果您进行编辑,则页面将重新...
  • composer require kyslik/laravel-filterable 如果您使用的是Laravel 7: composer require kyslik/laravel-filterable dev-L7 Laravel会自己发现这个包。 如果您觉得过时了,请禁用自动发现并将Kyslik\...
  • 项目使用vue2.6+iview3.0,其中有一个需求是下拉框能够输入过滤,iview的select有个filterable属性可以实现这个效果。但是加上这个属性后发现选中文字前后都有大量的空格导致选中的条目位置发生了变化。 解决办法: ...

    问题:

    项目使用vue2.6+iview3.0,其中有一个需求是下拉框能够输入过滤,iview的select有个filterable属性可以实现这个效果。但是加上这个属性后发现选中文字前后都有大量的空格导致选中的条目位置发生了变化。

    导致原因:

    • option标签中 {{}} 前后的空格和换行部分被iview读取了

    解决办法:

    将option标签中换行导致的空格去掉,或者使用label属性接受option赋值就好了

    <!--修改之前问题代码-->
    <Select v-model='value' filterable>
          <Option v-for='(dict, index) in dictList' :value="dict.value" :key="index">
                {{dict.label}}
          </Option>
    </Select>
    
    <!--修改之后将option标签换行的空格去掉就ok了-->
    <Select v-model='value' filterable>
          <Option v-for='(dict, index) in dictList' :value="dict.value" :key="index">{{dict.label}}</Option>
    </Select>
    
    <!--或者使用label属性-->
    <Select v-model='value' filterable>
          <Option v-for='(dict, index) in dictList' :value="dict.value" :label="dict.label" :key="index"></Option>
    </Select>
    
    展开全文
  • 一.Ctrl+Shift切换你的输入法,你再试试filterable有不有效?? 二.如果有效了,那很好。原因就是elementUI本身的一个bug。 三.解决办法参考大神解决办法: https://www.cnblogs.com/cinser/p/12018961.html.

    .Ctrl+Shift切换你的输入法,你再试试filterable有不有效??
    .如果有效了,那很好。原因就是elementUI本身的一个bug。
    .解决办法参考大神解决办法:
    https://www.cnblogs.com/cinser/p/12018961.html.
    附:一个非常好的学习网站:https://how2j.cn?p=37994

    展开全文
  • iview的Select组件filterable

    千次阅读 2019-04-01 17:25:42
    <FormItem label="国家">...Select v-model="country" ref="sel" filterable> <Option v-for="item of countryList" :value="item.name" :key="item.id" > {{item.name}} </Op...
  • Filterable的使用

    2018-06-19 10:40:34
    Filterable的使用 过滤器接口 使用 在列表中使用 通过添加过滤条件,刷新符合条件的数据并显示。在列表中,通常都是在适配器实现Filterable接口,并重写getFilter方法。如下是getFilter方法的一个案例 @Override ...
  • 拓展...说实话,Iview UI真的挺坑的,官方文档什么都没说,当Iview UI中Select 加了filterable属性,在加了remote和:remote-method.
  • use Dinkbit \ Filterable \ FiterableTrait ; class Post extends Eloquent { use FilterableTrait ; /** * Enabled filterable scopes. * * @var string */ protected $ filterable = [ 'price' , '...
  • 在使用select下拉框的过程中,需要进行查询,因此添加了filterable属性,但是造成bug,导致第二次选择只有上次选中的结果,解决方案如下: 1、在Select中添加ref="dataSet"属性。 <Select v-model="bindData" ...
  • 过滤Filterable

    2014-07-23 17:05:53
    至于Filterable的介绍和做什么用的大家就可以自行上网查找相关知识,其中有两个重要的方法   方法名 作用 protected FilterResults performFiltering(CharSequence ...
  • @blur.native.capture https://blog.csdn.net/IS_huang/article/details/105844365
  • 在项目中,遇到一个开发场景,可搜索下拉框里面需要默认选中第一条下拉框数据。 但是在测试的时候,发现下拉数据还没请求回来的时候,点击搜索输入框,等待下拉数据请求回来之后,输入框里面显示的是对应的id而非...
  • <Select v-model="deptId" filterable :only-filter-with-text="true"// //用来控制是否启用自定义的originValidateOption函数。true代表启用 clearable > <Option .
  • const FilterableTable = require ( 'react-filterable-table' ) ; // Data for the table to display; can be anything const data = [ { name : "Steve" , age : 27 , job : "Sandwich Eater" } , { name : ...
  • 实际情况对应的代码段: <!DOCTYPE html> <html> <head> <title>test</title> <script src="https://cdn.jsdelivr.net/npm/vue@2.6.12"></script>...
  • public class SearchNeighbourRvAdapter extends BaseQuickAdapter, BaseViewHolder> implements Filterable { private List<User> mNeighbourFriendItemTotalList = new ArrayList();//总列表集合 private List...
  • 加了 filterable 属性,可搜索功能,选择选项之后,出来的结果前后有一大堆的空格,找了好久都不知道是啥原因,空格太多导致下一次进行搜索的时候光标位置不好确定,十分影响使用效果 最后解决了问题的方案是这样的...
  • iview select filterable属性使用下拉bug

    千次阅读 2019-01-11 11:14:31
    今天做项目时候在iview 原生自带的select中设置filterable,下拉时候可进行查询,但是发现选中载打开模态框每次都绑定上一次的值,解决方案就是在关闭弹框时候将this.$refs.select.setQuery(null),解决问题。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,566
精华内容 1,826
关键字:

filterable