Java 带searchView的ArrayList筛选器

Java 带searchView的ArrayList筛选器,java,android,arraylist,Java,Android,Arraylist,这是过滤包含strings.xml文本的ArrayList的正确方法吗?当我在搜索视图中输入一些字符时,我在列表视图中什么也得不到 public class SearchActivity extends AppCompatActivity { private ListView searchList; private SearchListAdapter searchListAdapter; private ArrayList<listContents> lis

这是过滤包含strings.xml文本的
ArrayList
的正确方法吗?当我在
搜索视图
中输入一些字符时,我在
列表视图
中什么也得不到

public class SearchActivity extends AppCompatActivity  {
    private ListView searchList;
    private SearchListAdapter searchListAdapter;
    private ArrayList<listContents> listArray;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_search);

        searchList = (ListView)findViewById(R.id.searchList);


        listContents listC[] = new listContents[]{

                new listContents(R.string.UtrujjTitle,R.string.UtrujjContent,R.drawable.image1),
                new listContents(R.string.AruzzTitle,R.string.AruzzContainer,R.drawable.image2),
                new listContents(R.string.ArzTitle,R.string.ArzContainer,R.drawable.image3)
        };

        listArray = new ArrayList<>(Arrays.asList(listC));
        searchListAdapter = new SearchListAdapter(getApplicationContext(),listArray);
        searchList.setAdapter(searchListAdapter);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.search, menu);

        final SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);

        SearchView searchView = (SearchView) menu.findItem(R.id.searchable).getActionView();
        searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));

        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText) { 
                ArrayList<listContents> filtered = new ArrayList<listContents>();

                for (int i = 0; i < listArray.size() ; i++){
                    String title = String.valueOf(listArray.get(i).getTitleList());
                    String contain = String.valueOf(listArray.get(i).getContentList());

                    if (title.contains(newText) || contain.contains(newText)){

                        listContents contents = new listContents(listArray.get(i).getTitleList(),
                                listArray.get(i).getContentList(),listArray.get(i).getImageList());

                        filtered.add(contents);
                    }

                    searchListAdapter = new SearchListAdapter(getApplicationContext(),filtered);
                    searchList.setAdapter(searchListAdapter);
                }

                return false;
            }
        });
        return true;
    }
}
公共类SearchActivity扩展了AppCompatActivity{
私有列表视图搜索列表;
专用SearchListAdapter SearchListAdapter;
私有数组列表数组;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u search);
searchList=(ListView)findViewById(R.id.searchList);
listContents listC[]=新的listContents[]{
新列表内容(R.string.UtrujjTitle、R.string.UtrujjContent、R.drawable.image1),
新的listContents(R.string.AruzzTitle、R.string.AruzzContainer、R.drawable.image2),
新列表内容(R.string.ArzTitle、R.string.ArzContainer、R.drawable.image3)
};
listArray=newarraylist(Arrays.asList(listC));
searchListAdapter=新的searchListAdapter(getApplicationContext(),listArray);
searchList.setAdapter(searchListAdapter);
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
MenuInflater充气机=getMenuInflater();
充气机。充气(右菜单。搜索,菜单);
最终SearchManager SearchManager=(SearchManager)getSystemService(Context.SEARCH\u服务);
SearchView SearchView=(SearchView)menu.findItem(R.id.searchable).getActionView();
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName());
searchView.setOnQueryTextListener(新的searchView.OnQueryTextListener(){
@凌驾
公共布尔值onQueryTextSubmit(字符串查询){
返回false;
}
@凌驾
公共布尔onQueryTextChange(字符串newText){
ArrayList filtered=新的ArrayList();
对于(int i=0;i
适配器类

    public class SearchListAdapter extends ArrayAdapter<listContents> {

    private Context context;
    private listContents[] listContentsList;
    private ArrayList<listContents> lister;

    public SearchListAdapter(Context context, ArrayList<listContents> list ) {
        super(context,0,list);
        this.context = context;
        this.lister = list;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        listContents listContents = getItem(position);

        if (convertView == null) {
            convertView = LayoutInflater.from(getContext()).inflate(R.layout.listresults, parent, false);
        }

        TextView title = (TextView) convertView.findViewById(R.id.listTitle);
        title.setText(listContents.getTitleList());

        TextView content = (TextView)convertView.findViewById(R.id.listContain);
        content.setText(listContents.getContentList());

        ImageView imageView = (ImageView)convertView.findViewById(R.id.listImage);
        imageView.setImageResource(listContents.getImageList());

        return convertView;
    }
}
公共类SearchListAdapter扩展了ArrayAdapter{
私人语境;
私有listContents[]listContentsList;
私有数组列表器;
公共SearchListAdapter(上下文、ArrayList列表){
超级(上下文,0,列表);
this.context=上下文;
this.lister=list;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
listContents listContents=getItem(位置);
if(convertView==null){
convertView=LayoutFlater.from(getContext()).inflate(R.layout.listresults,parent,false);
}
TextView title=(TextView)convertView.findViewById(R.id.listTitle);
title.setText(listContents.getTitleList());
TextView内容=(TextView)convertView.findViewById(R.id.listContain);
setText(listContents.getContentList());
ImageView ImageView=(ImageView)convertView.findViewById(R.id.listImage);
setImageResource(listContents.getImageList());
返回视图;
}
}

ArrayAdapter
在类中内置了过滤逻辑,因此您不必在每次查询时都创建新的适配器,只需使用查询字符串运行过滤方法即可。试试这个:

    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {
            return false;
        }

        @Override
        public boolean onQueryTextChange(String newText) {
            searchListAdapter.getFilter().filter(newText);

            return true;
        }
    });
执行比较时,
ArrayAdapter
过滤器在内部使用类的
toString
值,因此您需要为
listContents
重写
toString
,例如:

@Override
public String toString() {
    return getTitleList() + " - " + getContentList();
}

编辑: 我注意到您正在将资源ID而不是实际字符串传递给
listContents
类。诸如
R.string.UtrujjTitle
之类的值只是作为实际字符串标识符的整数

假设
getTitleList()
没有返回实际字符串,而只是返回资源id,那么上面的
toString
方法将不起作用。无论采用哪种过滤方法,都需要从资源id获取实际字符串来进行比较

然后,您可以选择更改代码,将实际字符串存储在
listContents
中,而不是资源id,或者传入
上下文
引用

使用
上下文
引用,您可以对
toString()
进行以下更改:


编辑2: 查看您的过滤代码,最有可能的错误是由以下两行代码引起的:

String title = String.valueOf(listArray.get(i).getTitleList());
String contain = String.valueOf(listArray.get(i).getContentList());
相反,您可能想做的(假设getter返回一个资源id)是:


然而,在使用过滤器功能时,重新实例化一个适配器很可能比重用同一个适配器的开销更大。但是,如果您希望保留现有的适配器,此更改可能会解决此问题。

ArrayAdapter
在类中内置了过滤逻辑,因此您不必在每次进行查询时都创建新的适配器,只需使用查询字符串运行过滤方法即可。试试这个:

    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {
            return false;
        }

        @Override
        public boolean onQueryTextChange(String newText) {
            searchListAdapter.getFilter().filter(newText);

            return true;
        }
    });
ArrayAdapter
过滤器内部使用
String title = getString(listArray.get(i).getTitleList());
String contain = getString(listArray.get(i).getContentList());