gpt4 book ai didi

android - 如何在 RealmRecyclerViewAdapter 中实现可过滤

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:22:36 25 4
gpt4 key购买 nike

我很好地使用了 RealmRecyclerViewAdapter。我的问题是实现一个不起作用的 Filterable。这是代码:

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

}
}
}

然后我返回错误:

java.lang.UnsupportedOperationException: This method is not supported by RealmResults.
at io.realm.RealmResults.addAll(RealmResults.java:710)
at com.example.matteo.downloadairports.fragment.ListAirportFragment$AirportAdapter$AirportFilter.publishResults

过滤并更新适配器后如何保存结果?

谢谢

最佳答案

将过滤移动到 publishResults 并使用 UI 线程 Realm 的查询来评估新结果。

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());
}
}
}

关于android - 如何在 RealmRecyclerViewAdapter 中实现可过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40630322/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com