Android 在自定义列表中搜索自定义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<

在自定义arrayAdapter中实现自定义getFilter时遇到问题。尝试了各种代码,但仍然没有成功。这是我的自定义阵列适配器

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