Android 如何在域适配器中过滤数据?
我在过滤领域适配器中的数据时面临问题。 我正在创建searchview,通过过滤域适配器中的数据来搜索数据 我的searchview实现代码是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
@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());
}
}
}