Android 在自定义列表中搜索自定义getFilter<;对象>;
在自定义arrayAdapter中实现自定义getFilter时遇到问题。尝试了各种代码,但仍然没有成功。这是我的自定义阵列适配器Android 在自定义列表中搜索自定义getFilter<;对象>;,android,Android,在自定义arrayAdapter中实现自定义getFilter时遇到问题。尝试了各种代码,但仍然没有成功。这是我的自定义阵列适配器 public class CallSMSAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements Filterable { private final static int TYPE_CALL=1,TYPE_SMS=2; private List<
public class CallSMSAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements Filterable {
private final static int TYPE_CALL=1,TYPE_SMS=2;
private List<Object> callSMSFeed = new ArrayList();
private List<Object> contactListFiltered;
// Context is not used here but may be required to
// perform complex operations or call methods from outside
private Context context;
// Constructor
public CallSMSAdapter(Context context){
this.context=context;
}
public void setCallSMSFeed(List<Object> callSMSFeed){
this.callSMSFeed = callSMSFeed;
}
// We need to override this as we need to differentiate
// which type viewHolder to be attached
// This is being called from onBindViewHolder() method
@Override
public int getItemViewType(int position) {
if (callSMSFeed.get(position) instanceof SMS) {
return TYPE_SMS;
}
return -1;
}
// Invoked by layout manager to replace the contents of the views
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {
int viewType=holder.getItemViewType();
SMS sms=(SMS)callSMSFeed.get(position);
((SMSViewHolder)holder).showSmsDetails(sms);
}
@Override
public int getItemCount(){return callSMSFeed.size();}
// Invoked by layout manager to create new views
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
// Attach layout for single cell
int layout = 0;
RecyclerView.ViewHolder viewHolder;
// Identify viewType returned by getItemViewType(...)
// and return ViewHolder Accordingly
layout=R.layout.single_list_item2;
View smsView = LayoutInflater
.from(parent.getContext())
.inflate(layout, parent, false);
viewHolder=new SMSViewHolder(smsView);
return viewHolder;
}
private void setFadeAnimation(View view) {
AlphaAnimation anim = new AlphaAnimation(0.0f, 1.0f);
anim.setDuration(500);
view.startAnimation(anim);
}
@Override
public Filter getFilter() {
return new Filter() {
@Override
protected FilterResults performFiltering(CharSequence charSequence) {
}
@Override
protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
}
};
}
// Second ViewHolder of object type SMS
// Reference to the views for each call items to display desired information
public class SMSViewHolder extends RecyclerView.ViewHolder {
private TextView senderNameTextView,smsContentTextView, smsTimeTextView;
public SMSViewHolder(View itemView) {
super(itemView);
// Initiate view
senderNameTextView =(TextView)itemView.findViewById(R.id.pNametxt);
smsContentTextView =(TextView)itemView.findViewById(R.id.pName2txt);
smsTimeTextView =(TextView)itemView.findViewById(R.id.pJobProfiletxt);
}
public void showSmsDetails(SMS sms){
// Attach values for each item
String senderName =sms.getSenderName();
String smsContent =sms.getSmsContent();
String smsTime =sms.getSmsTime();
senderNameTextView.setText(senderName);
smsContentTextView.setText(smsContent);
smsTimeTextView.setText(smsTime);
}
}
}
主要活动:
public class MainActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private LinearLayoutManager linearLayoutManager;
private List<Object> callSMSList;
private CallSMSAdapter callSMSAdapter;
SearchView searchView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recycler_view);
recyclerView=(RecyclerView)findViewById(R.id.recyclerView);
// Set Layout Manager
linearLayoutManager=new LinearLayoutManager(this);
recyclerView.setLayoutManager(linearLayoutManager);
// Limiting the size
recyclerView.setHasFixedSize(true);
// Initialize list items
init();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
// Associate searchable configuration with the SearchView
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
searchView = (SearchView) menu.findItem(R.id.action_search)
.getActionView();
searchView.setSearchableInfo(searchManager
.getSearchableInfo(getComponentName()));
searchView.setMaxWidth(Integer.MAX_VALUE);
// listening to search query text change
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
// filter recycler view when query submitted
callSMSAdapter.getFilter().filter(query);
return false;
}
@Override
public boolean onQueryTextChange(String query) {
// filter recycler view when text is changed
callSMSAdapter.getFilter().filter(query);
return false;
}
});
return true;
}
private void init(){
callSMSList =new ArrayList<>();
// Initiating Adapter
callSMSAdapter =new CallSMSAdapter(RecyclerViewActivity.this);
recyclerView.setAdapter(callSMSAdapter);
// Adding some demo data(Call & SMS Objects).
// You can get them from your data server
callSMSList.add(new SMS("Sandy","Hey, what's up?","9:42 AM"));
callSMSList.add(new SMS("John","Are you writing blog?","9:48 AM"));
callSMSList.add(new SMS("Kora","Thanks dude","9:57 AM"));
callSMSList.add(new SMS("Nick","Let's hang up","10:10 AM"));
callSMSList.add(new SMS("Rose","Bring me some chocolates","1035:10 AM"));
// Set items to adapter
callSMSAdapter.setCallSMSFeed(callSMSList);
callSMSAdapter.notifyDataSetChanged();
}
}
public类MainActivity扩展了AppCompatActivity{
私人回收站;
私人直线酒店经理直线酒店经理;
私有列表调用列表;
私人呼叫呼叫呼叫呼叫呼叫呼叫呼叫;
搜索视图搜索视图;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u recycler\u视图);
recyclerView=(recyclerView)findViewById(R.id.recyclerView);
//设置布局管理器
linearLayoutManager=新的linearLayoutManager(此);
recyclerView.setLayoutManager(linearLayoutManager);
//限制大小
recyclerView.setHasFixedSize(true);
//初始化列表项
init();
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
getMenuInflater().充气(右菜单菜单菜单主菜单);
//将可搜索配置与SearchView关联
SearchManager SearchManager=(SearchManager)getSystemService(Context.SEARCH\u服务);
searchView=(searchView)menu.findItem(R.id.action\u search)
.getActionView();
searchView.setSearchableInfo(searchManager
.getSearchableInfo(getComponentName());
searchView.setMaxWidth(整数.MAX_值);
//侦听搜索查询文本更改
searchView.setOnQueryTextListener(新的searchView.OnQueryTextListener(){
@凌驾
公共布尔值onQueryTextSubmit(字符串查询){
//提交查询时筛选回收器视图
调用smsadapter.getFilter().filter(查询);
返回false;
}
@凌驾
公共布尔onQueryTextChange(字符串查询){
//更改文本时的过滤器回收器视图
调用smsadapter.getFilter().filter(查询);
返回false;
}
});
返回true;
}
私有void init(){
callSMSList=newArrayList();
//启动适配器
callSMSAdapter=newcallsmsadapter(recycleServiceActivity.this);
recyclerView.setAdapter(callsMasdapter);
//添加一些演示数据(呼叫和短信对象)。
//您可以从数据服务器获取它们
添加(新短信(“桑迪”,“你好吗?”,“上午9:42”);
添加(新短信(“约翰”,“你在写博客吗?”,“上午9:48”);
添加(新短信(“Kora”,“谢谢你”,“早上9:57”);
添加(新短信(“尼克”,“我们挂断吧”,“上午10:10”);
添加(新短信(“玫瑰”,“给我拿些巧克力”,“上午10:35:10”);
//将项目设置为适配器
callSMSAdapter.setCallSMSFeed(callSMSList);
callSMSAdapter.notifyDataSetChanged();
}
}
我认为错误在于不知道如何获取每个对象中每个数据的值。由于每个对象都由3个值组成,因此我必须能够根据过滤器指示的搜索进行搜索
谢谢。你没有实现过滤器,你怎么能得到结果?使用一个已经实现了
Filterable
接口的适配器-在99%的情况下,编写自己的filter
是在重新发明轮子
public class MainActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private LinearLayoutManager linearLayoutManager;
private List<Object> callSMSList;
private CallSMSAdapter callSMSAdapter;
SearchView searchView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recycler_view);
recyclerView=(RecyclerView)findViewById(R.id.recyclerView);
// Set Layout Manager
linearLayoutManager=new LinearLayoutManager(this);
recyclerView.setLayoutManager(linearLayoutManager);
// Limiting the size
recyclerView.setHasFixedSize(true);
// Initialize list items
init();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
// Associate searchable configuration with the SearchView
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
searchView = (SearchView) menu.findItem(R.id.action_search)
.getActionView();
searchView.setSearchableInfo(searchManager
.getSearchableInfo(getComponentName()));
searchView.setMaxWidth(Integer.MAX_VALUE);
// listening to search query text change
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
// filter recycler view when query submitted
callSMSAdapter.getFilter().filter(query);
return false;
}
@Override
public boolean onQueryTextChange(String query) {
// filter recycler view when text is changed
callSMSAdapter.getFilter().filter(query);
return false;
}
});
return true;
}
private void init(){
callSMSList =new ArrayList<>();
// Initiating Adapter
callSMSAdapter =new CallSMSAdapter(RecyclerViewActivity.this);
recyclerView.setAdapter(callSMSAdapter);
// Adding some demo data(Call & SMS Objects).
// You can get them from your data server
callSMSList.add(new SMS("Sandy","Hey, what's up?","9:42 AM"));
callSMSList.add(new SMS("John","Are you writing blog?","9:48 AM"));
callSMSList.add(new SMS("Kora","Thanks dude","9:57 AM"));
callSMSList.add(new SMS("Nick","Let's hang up","10:10 AM"));
callSMSList.add(new SMS("Rose","Bring me some chocolates","1035:10 AM"));
// Set items to adapter
callSMSAdapter.setCallSMSFeed(callSMSList);
callSMSAdapter.notifyDataSetChanged();
}
}