android - 我的数据库中的搜索过滤器有问题

标签 android search realm full-text-search

我有一个搜索栏,可以在我的所有数据库中进行搜索。

    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String s) {

    return false;
}

@Override
public boolean onQueryTextChange(String s) {
    psList = ps_da.searchBox(s);
    adapterPS = new AdapterPS(ActivityPS.this,psList);
    recyclerView.setLayoutManager(new LinearLayoutManager(ActivityPS.this));
    recyclerView.setAdapter(adapterPS);
    return false;
}

我有一个警报对话框,可以过滤我的结果,显示在我的 recyclerview 中。

        imgFilter.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Dialog dialog = new Dialog(ActivityPS.this);
            dialog.setContentView(R.layout.dialog_filter_layout);
            Button btnfliter =dialog.findViewById(R.id.btncheckFilter);
            CheckBox chkActive = dialog.findViewById(R.id.chkActiveDirectory);
            CheckBox chkDNS = dialog.findViewById(R.id.chkDND);
            CheckBox chkDHCP = dialog.findViewById(R.id.chkDHCP);
            CheckBox chkVPN = dialog.findViewById(R.id.chkVPN);
            CheckBox IP = dialog.findViewById(R.id.IP);
            RadioGroup radioGroup = dialog.findViewById(R.id.radiogroupk);
            radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(RadioGroup group, int checkedId) {
                    RadioButton rd = group.findViewById(checkedId);
                    if (rd.isChecked()){
                        if (rd.getText().equals("Client")){
                            chkActive.setEnabled(false);
                            chkDHCP.setEnabled(false);
                            chkVPN.setEnabled(false);
                            chkDNS.setEnabled(false);
                        }else if (rd.getText().equals("All")){
                            chkActive.setEnabled(true);
                            chkDHCP.setEnabled(true);
                            chkVPN.setEnabled(true);
                            chkDNS.setEnabled(true);

                        }else if (rd.getText().equals("Server")){
                            chkActive.setEnabled(true);
                            chkDHCP.setEnabled(true);
                            chkVPN.setEnabled(true);
                            chkDNS.setEnabled(true);
                        }
                    }
                }
            });
            btnfliter.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    if (!IP.isChecked()){
                        if (chkActive.isChecked()){
                            acvtiveDirectory = chkActive.getText().toString();
                        }if (chkDHCP.isChecked()){
                            DHCP =chkDHCP.getText().toString();
                        }if (chkDNS.isChecked()){
                            DNS = chkDNS.getText().toString();
                        }if (chkVPN.isChecked()){
                            VPN = chkVPN.getText().toString();
                        }   psList =ps_da.searchByFilter(acvtiveDirectory,DNS,DHCP,VPN);
                            adapterPS = new AdapterPS(ActivityPS.this,psList);
                            recyclerView.setAdapter(adapterPS);
                            adapterPS.notifyDataSetChanged();
                            dialog.dismiss();
                    }else {
                        psList = ps_da.findAll();
                        adapterPS = new AdapterPS(ActivityPS.this,psList);
                        recyclerView.setAdapter(adapterPS);
                        dialog.dismiss();
                    }
                }
            });
            dialog.show();
        }
    });

}

但是当我添加我的过滤器时它正确地显示在我的 recyclerview 上但是当我想在搜索栏中的 filtred 结果之间搜索时它在整个数据库中搜索。我想在 filtred 范围内搜索。有什么想法吗?

这就是我的 PS 对象的 Realm DA 类:

public RealmResults<PS> findAll(){
    pslist = myrealm.where(PS.class).findAll();
    return pslist;
}

public RealmResults<PS> searchBox(String s){
    pslist = myrealm.where(PS.class).contains("commandName",s, Case.INSENSITIVE).findAll();
    return pslist;
}

public RealmResults<PS> searchByFilter(String Active,String DNS,String DHCP,String VPN){
    pslist = myrealm.where(PS.class).beginGroup().equalTo("commandName",Active)
            .or()
            .equalTo("commandName",DHCP)
            .or()
            .equalTo("commandName",DNS)
            .or()
            .equalTo("commandName",VPN)
            .endGroup().findAll();


    return pslist;
}

最佳答案

onQueryTextChange 中,您每次都创建一个新的适配器。

您需要实例化一次适配器并将其引用保留在您的 Activity 中,这样您就可以为其设置数据并调用 getFilter().filter("") 来过滤您所做的数据放。 要在适配器中使用过滤器,您可以实现 Filterable,但在 performFiltering 方法 ( Filtering Realm object in android) 中返回结果。

这里是一个例子(没有测试)

public class MyAdapter extends BaseAdapter<ArticleEntity> implements Filterable{

private RealmResults<ArticleEntity> items;
private RealmResults<ArticleEntity> filteredItems;
private ArticleFilter filter;

public MyAdapter(RealmResults<ArticleEntity> items) {
    this.items = items;
    filter = new ArticleFilter();
    filter.filter("");
}

public void setItems(RealmResults<ArticleEntity> items) {
    this.items = items;
    filter.filter("");
}

@Override
public int getCount() {
    return filteredItems.size();
}

@Override
public ArticleEntity getItem(int position) {
    return null;
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public Filter getFilter() {
    return filter;
}

private class ArticleFilter extends Filter {

    @Override
    protected FilterResults performFiltering(CharSequence constraint) {
        return new FilterResults();
    }

    @Override
    @SuppressWarnings("unchecked")
    protected void publishResults(CharSequence constraint, FilterResults results) {
        filteredItems = items.where()
                .equalTo("your_field", "value")
                .sort("name")
                .findAll();
        notifyDataSetChanged();
    }
}

因此,基于复选框的过滤应该在过滤器 publishResults 方法中完成。

关于android - 我的数据库中的搜索过滤器有问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54377015/

相关文章:

search - 如何强制对Elasticsearch “terms”查询进行not_analyzed

ios - RLMException,对象类型需要迁移

android - Kotlin扩展函数: unresolved reference

android - onSaveInstanceState 回调如何保存一个 SpannableString

android - Google Play 限制使用短信和通话记录权限

android - 如何使用同一应用程序将通知从一个用户发送到另一个用户

swift - iCloud 文档文件太大

android - 清除 Chrome 浏览器的历史记录

php - 如何防止 "space"搜索 MySQL 数据库?

elasticsearch - 用于Elasticsearch的 boolean 搜索模糊查询-意外结果- “Word1”和 “Word2”〜3