In Odoo 11, here is how to achieve this:
Let's say we want to add special filtering functionality through a button
First create a template that is responsible of displaying the button :
<?xml version="1.0" encoding="UTF-8"?>
<template xml:space="preserve">
<t t-extend="ListView.buttons">
<t t-jquery="button.o_list_button_add" t-operation="after">
<button t-if="widget.modelName == 'your.model.name'" type="button" class="btn btn-primary btn-sm oe_filter_button" accesskey="f">
Advanced Filters
</button>
</t>
</t>
</template>
P.S.:Don't forget to add the file containing the above template to the manifest
So far the button will be available but not functional. In order to make it functional, you have to add javascript support for its click event :
odoo.define('whatever.filter_button', function (require) {
"use strict";
var core = require('web.core');
var ListController = require('web.ListController');
ListController.include({
renderButtons: function($node) {
this._super.apply(this, arguments);
if (this.$buttons) {
let filter_button = this.$buttons.find('.oe_filter_button');
filter_button && filter_button.click(this.proxy('filter_button')) ;
}
},
filter_button: function () {
console.log('yay filter')
//implement your click logic here
}
});
})
Then, load the javascript file you wrote as a script like:
<template id="assets_backend" name="whatever_name assets" inherit_id="web.assets_backend">
<xpath expr="." position="inside">
<script src="/your_module_name/static/src/js/filter_button.js" type="text/javascript"/>
</xpath>
</template>
For further implementation details, don't hesitate to post your comments or questions :)
In latest odoo versions, it can be achieved easily as we do in form view, see: https://www.youtube.com/watch?v=R8eG6uOxHKw