Android 如何在RealmRecyclServiceAdapter中实现filterable
我用的是well RealmRecyclServiceAdapter。我的问题是实现一个不起作用的Android 如何在RealmRecyclServiceAdapter中实现filterable,android,filter,android-recyclerview,realm,android-filterable,Android,Filter,Android Recyclerview,Realm,Android Filterable,我用的是well RealmRecyclServiceAdapter。我的问题是实现一个不起作用的可过滤。代码如下: private class AirportAdapter extends RealmRecyclerViewAdapter<AirportR,RecyclerView.ViewHolder> implements Filterable { Context context; OrderedRealmCollection<AirportR>l
可过滤。代码如下:
private class AirportAdapter extends RealmRecyclerViewAdapter<AirportR,RecyclerView.ViewHolder> implements Filterable
{
Context context;
OrderedRealmCollection<AirportR>listAirports;
public AirportAdapter(Context activity, OrderedRealmCollection<AirportR>airports)
{
super(activity,airports, true);
this.context = activity;
this.listAirports = airports;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
{
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.airport_show, parent,false);
AirportClass holder = new AirportClass(view);
return holder;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position)
{
AirportR airportR = listAirports.get(position);
AirportClass mHolder = (AirportClass)holder;
mHolder.country.setText(airportR.getIsoCountry());
mHolder.name.setText(airportR.getName());
}
public Filter getFilter()
{
AirportFilter filter = new AirportFilter(this, listAirports);
return filter;
}
private class AirportFilter extends Filter
{
private final AirportAdapter adapter;
OrderedRealmCollection<AirportR>originalList;
OrderedRealmCollection<AirportR>filteredList;
private AirportFilter(AirportAdapter adapter, OrderedRealmCollection<AirportR> originalList)
{
super();
this.adapter = adapter;
this.originalList = originalList;
}
@Override
protected FilterResults performFiltering(CharSequence constraint)
{
filteredList.clear();
final FilterResults results = new FilterResults();
if (constraint.length() == 0)
{
filteredList.addAll(originalList);
}
else
{
final String filterPattern = constraint.toString().toLowerCase().trim();
for (final AirportR airportR : originalList)
{
if (airportR.getName().toLowerCase().contains(filterPattern))
{
filteredList.add(airportR);
}
}
}
results.values = filteredList;
results.count = filteredList.size();
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results)
{
adapter.listAirports.addAll((OrderedRealmCollection<AirportR>) results.values);
adapter.notifyDataSetChanged();
}
}
private class AirportClass extends RecyclerView.ViewHolder
{
TextView name, country;
ImageView image;
public AirportClass(View itemView)
{
super(itemView);
name = (TextView)itemView.findViewById(R.id.name);
country = (TextView)itemView.findViewById(R.id.country);
image = (ImageView)itemView.findViewById(R.id.imageView);
}
}
}
过滤并更新适配器后,如何保存结果
谢谢将筛选移动到publishResults
,并使用UI线程领域的查询来评估新结果
private class AirportAdapter
extends RealmRecyclerViewAdapter<AirportR, RecyclerView.ViewHolder>
implements Filterable {
Realm realm;
public AirportAdapter(Context context, Realm realm, OrderedRealmCollection<AirportR> airports) {
super(context, airports, true);
this.realm = realm;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.airport_show, parent, false);
AirportClass holder = new AirportClass(view);
return holder;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
AirportR airportR = getData().get(position);
AirportClass mHolder = (AirportClass) holder;
mHolder.bind(airportR);
}
public void filterResults(String text) {
text = text == null ? null : text.toLowerCase().trim();
RealmQuery<AirportR> query = realm.where(AirportR.class);
if(!(text == null || "".equals(text))) {
query.contains("fieldToQueryBy", text, Case.INSENSITIVE) // TODO: change field
}
updateData(query.findAllAsync());
}
public Filter getFilter() {
AirportFilter filter = new AirportFilter(this);
return filter;
}
private class AirportFilter
extends Filter {
private final AirportAdapter adapter;
private AirportFilter(AirportAdapter adapter) {
super();
this.adapter = adapter;
}
@Override
protected FilterResults performFiltering(CharSequence constraint) {
return new FilterResults();
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
adapter.filterResults(constraint.toString());
}
}
private class AirportClass
extends RecyclerView.ViewHolder {
TextView name, country;
ImageView image;
public AirportClass(View itemView) {
super(itemView);
name = (TextView) itemView.findViewById(R.id.name);
country = (TextView) itemView.findViewById(R.id.country);
image = (ImageView) itemView.findViewById(R.id.imageView);
}
public void bind(AirportR airportR) {
country.setText(airportR.getIsoCountry());
name.setText(airportR.getName());
}
}
}
专用类AirportAdapter
扩展RealmRecyclServiceAdapter
可过滤的{
境界;
公共AirportAdapter(上下文上下文、领域域、OrderedRealmCollection机场){
超级(上下文、机场、真实);
this.realm=领域;
}
@凌驾
public RecyclerView.ViewHolder onCreateViewHolder(视图组父级,int-viewType){
视图=LayoutFlater.from(parent.getContext()).flate(R.layout.airport\u show,parent,false);
AirportClass holder=新的AirportClass(视图);
报税表持有人;
}
@凌驾
BindViewHolder上的公共无效(RecyclerView.ViewHolder,int位置){
AirportR AirportR=getData().get(位置);
AirportClass mHolder=(AirportClass)持有人;
mHolder.bind(机场);
}
公共无效筛选器结果(字符串文本){
text=text==null?null:text.toLowerCase().trim();
RealmQuery=realm.where(AirportR.class);
如果(!(text==null | |“”.equals(text))){
contains(“fieldToQueryBy”,文本,不区分大小写)//TODO:change字段
}
updateData(query.findAllAsync());
}
公共过滤器getFilter(){
AirportFilter过滤器=新的AirportFilter(此过滤器);
回流过滤器;
}
私有类AirportFilter
扩展过滤器{
专用最终机场适配器;
专用AirportFilter(AirportAdapter适配器){
超级();
this.adapter=适配器;
}
@凌驾
受保护的筛选器结果性能筛选(CharSequence约束){
返回新的FilterResults();
}
@凌驾
受保护的void publishResults(CharSequence约束、FilterResults结果){
adapter.filterResults(constraint.toString());
}
}
私人类机场类
扩展RecyclerView.ViewHolder{
TextView名称、国家/地区;
图像视图图像;
公共机场类别(查看项目视图){
超级(项目视图);
name=(TextView)itemView.findViewById(R.id.name);
country=(TextView)itemView.findViewById(R.id.country);
image=(ImageView)itemView.findViewById(R.id.ImageView);
}
公共无效绑定(AirportR AirportR){
country.setText(airportR.getIsoCountry());
name.setText(airportR.getName());
}
}
}
在适配器中添加此选项,它可能会对您有所帮助
fun filterResults(text: String?, realm: Realm) {
var text = text
text = text?.toLowerCase()?.trim { it <= ' ' }
val query = realm.where(YourObject::class.java)
if (!(text == null || "" == text)) {
query.contains("username", text, Case.INSENSITIVE).or().contains("username2", text, Case.INSENSITIVE)
}
updateData(query.findAllAsync()) // or findAll()
}
fun filterResults(文本:字符串?,领域:领域){
var text=text
text=text?.toLowerCase()?.trim{很高兴听到我可以简化您使用领域的方式:p@EpicPandaForce-你能给我看看最新的数据(列表机场)吗;如何在筛选之后和之前更新listview项?@user2269164这是来自@EpicPandaForce的RealmRecyclServiceAdapter方法-为listview实现的任何代码?@pentarex复制粘贴错误。甚至不应该存在。
fun filterResults(text: String?, realm: Realm) {
var text = text
text = text?.toLowerCase()?.trim { it <= ' ' }
val query = realm.where(YourObject::class.java)
if (!(text == null || "" == text)) {
query.contains("username", text, Case.INSENSITIVE).or().contains("username2", text, Case.INSENSITIVE)
}
updateData(query.findAllAsync()) // or findAll()
}