Android 如何在域适配器中过滤数据?

Android 如何在域适配器中过滤数据?,android,realm,Android,Realm,我在过滤领域适配器中的数据时面临问题。 我正在创建searchview,通过过滤域适配器中的数据来搜索数据 我的searchview实现代码是 @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.main_menu, menu); final MenuItem item = menu.findItem

我在过滤领域适配器中的数据时面临问题。 我正在创建searchview,通过过滤域适配器中的数据来搜索数据

我的searchview实现代码是

  @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.main_menu, menu);

        final MenuItem item = menu.findItem(R.id.action_search);
        final SearchView searchView = (SearchView) MenuItemCompat.getActionView(item);
        Log.e("Filter ","Filtering");
        searchView.setOnQueryTextListener(this);

        MenuItemCompat.setOnActionExpandListener(item,
                new MenuItemCompat.OnActionExpandListener() {
                    @Override
                    public boolean onMenuItemActionCollapse(MenuItem item) {
// Do something when collapsed
                        adapter.setFilter(realmPhonecallList);

                        Log.e("Filter 1","Filtering");
                        return true; // Return true to collapse action view
                    }

                    @Override
                    public boolean onMenuItemActionExpand(MenuItem item) {
// Do something when expanded
                        return true; // Return true to expand action view
                    }
                });
    }



    @Override
    public boolean onQueryTextSubmit(String newText) {

        return true;
    }

    @Override
    public boolean onQueryTextChange(String newText) {
        final List<RealmPhoneCallLogs> filteredModelList = filter(realmPhonecallList, newText);
        Log.e("Filter 2","Filtering" + newText);
        adapter.setFilter(filteredModelList);
        Log.e("Filter 3","Filtering" + filteredModelList);
        return true;
    }

    private List<RealmPhoneCallLogs> filter(List<RealmPhoneCallLogs> models, String query) {
        query = query.toLowerCase();

        final List<RealmPhoneCallLogs> filteredModelList = new ArrayList<>();
        for (RealmPhoneCallLogs model : models) {
            final String text = model.getNumber().toLowerCase();
            if (text.contains(query)) {
                filteredModelList.add(model);
            }
        }
        Log.e("Filter 4","Filtering" + filteredModelList);
        return filteredModelList;
    }
private class MyNamesAdapter extends RealmBaseAdapter<RealmPhoneCallLogs> {

    List<RealmPhoneCallLogs> filter;

    public MyNamesAdapter(OrderedRealmCollection<RealmPhoneCallLogs> data) {
        super(data);
        this.filter = data;
    }

    public class ViewHolder {
        TextView number;
        TextView callType;
        TextView startTime;
        TextView contactName;
        TextView callDuration;
        TextView fileSize;
        ImageView contactPhoto;
        ImageView callSymbol;
    }


    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        final RealmPhoneCallLogs realmPhoneCallLogs = getItem(position);
        ViewHolder viewHolder;
        if (convertView == null) {
            viewHolder = new ViewHolder();
            LayoutInflater inflater = LayoutInflater.from(getContext());
            convertView = inflater.inflate(R.layout.calllog_layout, parent, false);
            viewHolder.number = (TextView) convertView.findViewById(R.id.missedNumber);
            viewHolder.startTime = (TextView) convertView.findViewById(R.id.missedStartTime);
            viewHolder.contactName = (TextView) convertView.findViewById(R.id.missedContactName);
            viewHolder.callDuration = (TextView) convertView.findViewById(R.id.missedCallDuration);
            viewHolder.fileSize = (TextView) convertView.findViewById(R.id.missedFileSize);
            viewHolder.contactPhoto = (ImageView) convertView.findViewById(R.id.missedImage);
            viewHolder.callSymbol = (ImageView) convertView.findViewById(R.id.callSymbol);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }

        if (adapterData != null) {
            viewHolder.number.setText(realmPhoneCallLogs.getNumber());
            viewHolder.contactName.setText(getContactName(realmPhoneCallLogs.getNumber()));
            viewHolder.callDuration.setText(getTime(realmPhoneCallLogs.getCallDuration()));
            viewHolder.startTime.setText(realmPhoneCallLogs.getStartTime());
            viewHolder.contactPhoto.setImageBitmap(getContactsImage(realmPhoneCallLogs.getNumber()));
            String path = new String(Environment.getExternalStorageDirectory() + "/NewCallLogs/" + realmPhoneCallLogs.getCallRecords());
            File file = new File(path);
            String size;

            long filesize = file.length();
            long fileSizeInKB = filesize / 1024;
            long fileSizeInMB = fileSizeInKB / 1024;
            if(fileSizeInKB >=1024){
                 size= fileSizeInMB + " Mb";
            }else {
                 size = fileSizeInKB + " Kb";
            }
            if(!size.isEmpty()){
                viewHolder.fileSize.setText(size);
            }else{
                viewHolder.fileSize.setText(0);
            }



            if (realmPhoneCallLogs.getCallType().equals("I")) {
                viewHolder.callSymbol.setImageResource(R.mipmap.call_received);
            } else if (realmPhoneCallLogs.getCallType().equals("O")) {
                viewHolder.callSymbol.setImageResource(R.mipmap.call_made);
            } else if (realmPhoneCallLogs.getCallStatus().equals("UA")) {
                viewHolder.callSymbol.setImageResource(R.mipmap.call_missed);
            }

            return convertView;
        }
        return convertView;
    }

    public void setFilter( List<RealmPhoneCallLogs> filtedData) {
        filter = new ArrayList<>();
        filter.addAll(filtedData);
        notifyDataSetChanged();
    }
}
@覆盖
创建选项菜单(菜单菜单,菜单充气机){
充气机。充气(右菜单。主菜单,菜单);
final MenuItem=menu.findItem(R.id.action\u search);
最终搜索视图SearchView=(SearchView)MenuItemCompat.getActionView(项);
Log.e(“过滤器”、“过滤”);
setOnQueryTextListener(这个);
MenuItemCompat.setOnActionExpandListener(项,
新MenuItemCompat.OnActionExpandListener()函数{
@凌驾
公共布尔值onMenuItemActionCollapse(MenuItem项){
//崩溃时做点什么
adapter.setFilter(realmPhonecallList);
Log.e(“过滤器1”、“过滤”);
return true;//将true返回到折叠操作视图
}
@凌驾
公共布尔值onMenuItemActionExpand(MenuItem项){
//扩展时做某事
return true;//返回true以展开操作视图
}
});
}
@凌驾
公共布尔值onQueryTextSubmit(字符串newText){
返回true;
}
@凌驾
公共布尔onQueryTextChange(字符串newText){
final List filteredModelList=过滤器(realmPhonecallList,newText);
Log.e(“过滤2”,“过滤”+newText);
adapter.setFilter(filteredModelList);
Log.e(“过滤器3”、“过滤”+filteredModelList);
返回true;
}
私有列表筛选器(列表模型、字符串查询){
query=query.toLowerCase();
final List filteredModelList=new ArrayList();
对于(RealmPhoneCallLogs模型:模型){
最终字符串文本=model.getNumber().toLowerCase();
if(text.contains(查询)){
filteredModelList.add(model);
}
}
Log.e(“过滤器4”、“过滤”+filteredModelList);
返回filteredModelList;
}
我的领域适配器实现是

  @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.main_menu, menu);

        final MenuItem item = menu.findItem(R.id.action_search);
        final SearchView searchView = (SearchView) MenuItemCompat.getActionView(item);
        Log.e("Filter ","Filtering");
        searchView.setOnQueryTextListener(this);

        MenuItemCompat.setOnActionExpandListener(item,
                new MenuItemCompat.OnActionExpandListener() {
                    @Override
                    public boolean onMenuItemActionCollapse(MenuItem item) {
// Do something when collapsed
                        adapter.setFilter(realmPhonecallList);

                        Log.e("Filter 1","Filtering");
                        return true; // Return true to collapse action view
                    }

                    @Override
                    public boolean onMenuItemActionExpand(MenuItem item) {
// Do something when expanded
                        return true; // Return true to expand action view
                    }
                });
    }



    @Override
    public boolean onQueryTextSubmit(String newText) {

        return true;
    }

    @Override
    public boolean onQueryTextChange(String newText) {
        final List<RealmPhoneCallLogs> filteredModelList = filter(realmPhonecallList, newText);
        Log.e("Filter 2","Filtering" + newText);
        adapter.setFilter(filteredModelList);
        Log.e("Filter 3","Filtering" + filteredModelList);
        return true;
    }

    private List<RealmPhoneCallLogs> filter(List<RealmPhoneCallLogs> models, String query) {
        query = query.toLowerCase();

        final List<RealmPhoneCallLogs> filteredModelList = new ArrayList<>();
        for (RealmPhoneCallLogs model : models) {
            final String text = model.getNumber().toLowerCase();
            if (text.contains(query)) {
                filteredModelList.add(model);
            }
        }
        Log.e("Filter 4","Filtering" + filteredModelList);
        return filteredModelList;
    }
private class MyNamesAdapter extends RealmBaseAdapter<RealmPhoneCallLogs> {

    List<RealmPhoneCallLogs> filter;

    public MyNamesAdapter(OrderedRealmCollection<RealmPhoneCallLogs> data) {
        super(data);
        this.filter = data;
    }

    public class ViewHolder {
        TextView number;
        TextView callType;
        TextView startTime;
        TextView contactName;
        TextView callDuration;
        TextView fileSize;
        ImageView contactPhoto;
        ImageView callSymbol;
    }


    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        final RealmPhoneCallLogs realmPhoneCallLogs = getItem(position);
        ViewHolder viewHolder;
        if (convertView == null) {
            viewHolder = new ViewHolder();
            LayoutInflater inflater = LayoutInflater.from(getContext());
            convertView = inflater.inflate(R.layout.calllog_layout, parent, false);
            viewHolder.number = (TextView) convertView.findViewById(R.id.missedNumber);
            viewHolder.startTime = (TextView) convertView.findViewById(R.id.missedStartTime);
            viewHolder.contactName = (TextView) convertView.findViewById(R.id.missedContactName);
            viewHolder.callDuration = (TextView) convertView.findViewById(R.id.missedCallDuration);
            viewHolder.fileSize = (TextView) convertView.findViewById(R.id.missedFileSize);
            viewHolder.contactPhoto = (ImageView) convertView.findViewById(R.id.missedImage);
            viewHolder.callSymbol = (ImageView) convertView.findViewById(R.id.callSymbol);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }

        if (adapterData != null) {
            viewHolder.number.setText(realmPhoneCallLogs.getNumber());
            viewHolder.contactName.setText(getContactName(realmPhoneCallLogs.getNumber()));
            viewHolder.callDuration.setText(getTime(realmPhoneCallLogs.getCallDuration()));
            viewHolder.startTime.setText(realmPhoneCallLogs.getStartTime());
            viewHolder.contactPhoto.setImageBitmap(getContactsImage(realmPhoneCallLogs.getNumber()));
            String path = new String(Environment.getExternalStorageDirectory() + "/NewCallLogs/" + realmPhoneCallLogs.getCallRecords());
            File file = new File(path);
            String size;

            long filesize = file.length();
            long fileSizeInKB = filesize / 1024;
            long fileSizeInMB = fileSizeInKB / 1024;
            if(fileSizeInKB >=1024){
                 size= fileSizeInMB + " Mb";
            }else {
                 size = fileSizeInKB + " Kb";
            }
            if(!size.isEmpty()){
                viewHolder.fileSize.setText(size);
            }else{
                viewHolder.fileSize.setText(0);
            }



            if (realmPhoneCallLogs.getCallType().equals("I")) {
                viewHolder.callSymbol.setImageResource(R.mipmap.call_received);
            } else if (realmPhoneCallLogs.getCallType().equals("O")) {
                viewHolder.callSymbol.setImageResource(R.mipmap.call_made);
            } else if (realmPhoneCallLogs.getCallStatus().equals("UA")) {
                viewHolder.callSymbol.setImageResource(R.mipmap.call_missed);
            }

            return convertView;
        }
        return convertView;
    }

    public void setFilter( List<RealmPhoneCallLogs> filtedData) {
        filter = new ArrayList<>();
        filter.addAll(filtedData);
        notifyDataSetChanged();
    }
}
私有类MyNameAdapter扩展RealmBaseAdapter{
列表过滤器;
公共MyNameAdapter(OrderedRealmCollection数据){
超级(数据);
this.filter=数据;
}
公共类视图持有者{
文本视图编号;
文本视图调用类型;
文本视图开始时间;
TextView联系人姓名;
文本视图调用持续时间;
文本视图文件大小;
ImageView联系人照片;
图像视图调用符号;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
最终RealmPhoneCallLogs RealmPhoneCallLogs=getItem(位置);
持票人持票人;
if(convertView==null){
viewHolder=新的viewHolder();
LayoutInflater充气器=LayoutInflater.from(getContext());
convertView=充气机。充气(R.layout.calllog\u布局,父级,false);
viewHolder.number=(TextView)convertView.findViewById(R.id.missdNumber);
viewHolder.startTime=(TextView)convertView.findViewById(R.id.missedStartTime);
viewHolder.contactName=(TextView)convertView.findViewById(R.id.missedContactName);
viewHolder.callDuration=(TextView)convertView.findViewById(R.id.missedCallDuration);
viewHolder.fileSize=(TextView)convertView.findViewById(R.id.missedFileSize);
viewHolder.contactPhoto=(ImageView)convertView.findViewById(R.id.missedImage);
viewHolder.callSymbol=(ImageView)convertView.findViewById(R.id.callSymbol);
convertView.setTag(viewHolder);
}否则{
viewHolder=(viewHolder)convertView.getTag();
}
如果(adapterData!=null){
viewHolder.number.setText(realmPhoneCallLogs.getNumber());
viewHolder.contactName.setText(getContactName(realmPhoneCallLogs.getNumber());
viewHolder.callDuration.setText(getTime(realmPhoneCallLogs.getCallDuration());
viewHolder.startTime.setText(realmPhoneCallLogs.getStartTime());
viewHolder.contactPhoto.setImageBitmap(getContactsImage(realmPhoneCallLogs.getNumber());
字符串路径=新字符串(Environment.getExternalStorageDirectory()+“/NewCallLogs/”+realmPhoneCallLogs.getCallRecords());
文件=新文件(路径);
字符串大小;
long filesize=file.length();
long fileSizeInKB=filesize/1024;
long fileSizeInMB=fileSizeInKB/1024;
如果(fileSizeInKB>=1024){
大小=fileSizeInMB+“Mb”;
}否则{
大小=fileSizeInKB+“Kb”;
}
如果(!size.isEmpty()){
viewHolder.fileSize.setText(大小);
}否则{
viewHolder.fileSize.setText(0);
}
if(realmPhoneCallLogs.getCallType().equals(“I”)){
viewHolder.callSymbol.setImageResource(R.mipmap.call_已接收);
}else if(realmPhoneCallLogs.getCallType().equals(“O”)){
viewHolder.callSymbol.setImageResource(R.mipmap.call_制作);
}else if(realmPhoneCallLogs.getCallStatus().equals(“UA”)){
viewHolder.callSymbol.setImageResource(R.mipmap.call_missed);
}
返回视图;
}
返回视图;
}
公共void setFilter(列表filtedData){
过滤器=新的ArrayList();
filter.addAll(filtedData);
notifyDataSetChanged();
}
}

请帮助我如何过滤领域中的数据。

下面是一个可过滤的回收视图的示例,其中包含领域:


以下是问题线索:

然后就像在

private class MyNamesAdapter extends RealmBaseAdapter<RealmPhoneCallLogs> implements Filterable { public MyNamesAdapter(OrderedRealmCollection<RealmPhoneCallLogs> data) { super(data); } public class ViewHolder { TextView number; TextView callType; TextView startTime; TextView contactName; TextView callDuration; TextView fileSize; ImageView contactPhoto; ImageView callSymbol; } @Override public View getView(int position, View convertView, ViewGroup parent) { final RealmPhoneCallLogs realmPhoneCallLogs = getItem(position); ViewHolder viewHolder; if(convertView == null) { viewHolder = new ViewHolder(); LayoutInflater inflater = LayoutInflater.from(getContext()); convertView = inflater.inflate(R.layout.calllog_layout, parent, false); viewHolder.number = (TextView) convertView.findViewById(R.id.missedNumber); viewHolder.startTime = (TextView) convertView.findViewById(R.id.missedStartTime); viewHolder.contactName = (TextView) convertView.findViewById(R.id.missedContactName); viewHolder.callDuration = (TextView) convertView.findViewById(R.id.missedCallDuration); viewHolder.fileSize = (TextView) convertView.findViewById(R.id.missedFileSize); viewHolder.contactPhoto = (ImageView) convertView.findViewById(R.id.missedImage); viewHolder.callSymbol = (ImageView) convertView.findViewById(R.id.callSymbol); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); } if(adapterData != null) { viewHolder.number.setText(realmPhoneCallLogs.getNumber()); viewHolder.contactName.setText(getContactName(realmPhoneCallLogs.getNumber())); viewHolder.callDuration.setText(getTime(realmPhoneCallLogs.getCallDuration())); viewHolder.startTime.setText(realmPhoneCallLogs.getStartTime()); viewHolder.contactPhoto.setImageBitmap(getContactsImage(realmPhoneCallLogs.getNumber())); String path = new String(Environment.getExternalStorageDirectory() + "/NewCallLogs/" + realmPhoneCallLogs .getCallRecords()); File file = new File(path); String size; long filesize = file.length(); long fileSizeInKB = filesize / 1024; long fileSizeInMB = fileSizeInKB / 1024; if(fileSizeInKB >= 1024) { size = fileSizeInMB + " Mb"; } else { size = fileSizeInKB + " Kb"; } if(!size.isEmpty()) { viewHolder.fileSize.setText(size); } else { viewHolder.fileSize.setText(0); } if("I".equals(realmPhoneCallLogs.getCallType())) { viewHolder.callSymbol.setImageResource(R.mipmap.call_received); } else if("O".equals(realmPhoneCallLogs.getCallType())) { viewHolder.callSymbol.setImageResource(R.mipmap.call_made); } else if("UA".equals(realmPhoneCallLogs.getCallStatus())) { viewHolder.callSymbol.setImageResource(R.mipmap.call_missed); } return convertView; } return convertView; } // filtering public void filterResults(String text) { text = text == null ? null : text.toLowerCase().trim(); if(text == null || "".equals(text)) { updateData(realm.where(RealmPhoneCallLogs.class).findAllSorted("id"); } else { updateData(realm.where(RealmPhoneCallLogs.class) .contains("number", text, Case.INSENSITIVE) .findAllSorted("id")); } } public Filter getFilter() { return new MyNamesFilter(this); } private class MyNamesFilter extends Filter { private final MyNamesAdapter adapter; private MyNamesFilter(MyNamesAdapter 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()); } } }