android自定义列表视图搜索

android自定义列表视图搜索,android,listview,search,Android,Listview,Search,我一直在尝试为我的自定义listview设置搜索功能。 尽管我试图遵循许多答案或教程,但我无法将它们反映到我的适配器类中。你能帮我设置搜索功能吗? 提前谢谢 主类 public class Main_restaurant_list extends Activity { ArrayList < Restaurants > restaurantsList; RestaurantsAdapter adapter; ListView listview; Ed

我一直在尝试为我的自定义listview设置搜索功能。 尽管我试图遵循许多答案或教程,但我无法将它们反映到我的适配器类中。你能帮我设置搜索功能吗? 提前谢谢

主类

public class Main_restaurant_list extends Activity {
    ArrayList < Restaurants > restaurantsList;
    RestaurantsAdapter adapter;

    ListView listview;
    EditText editsearch;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main_restaurant_list);
            editsearch = (EditText) findViewById(R.id.search);
            listview = (ListView) findViewById(R.id.list);
            restaurantsList = new ArrayList < Restaurants > ();
            adapter = new RestaurantsAdapter(getApplicationContext(), R.layout.row_restaurant_list, restaurantsList);

            listview.setAdapter(adapter);

            editsearch.addTextChangedListener(new TextWatcher() {

                @Override
                public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
                    Main_restaurant_list.this.adapter.getFilter().filter(cs);
                }
                @Override
                public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {}
                @Override
                public void afterTextChanged(Editable arg0) {}
            });
公共类主餐厅列表扩展活动{
ArrayList<餐厅>餐厅列表;
餐厅适配器;
列表视图列表视图;
编辑文本编辑搜索;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(右布局、主餐厅列表);
editsearch=(EditText)findViewById(R.id.search);
listview=(listview)findViewById(R.id.list);
restaurantsList=new ArrayList();
adapter=newrestaurantsapter(getApplicationContext(),R.layout.row\u restaurant\u list,restaurantsList);
setAdapter(适配器);
editsearch.addTextChangedListener(新的TextWatcher(){
@凌驾
public void onTextChanged(字符序列cs、int arg1、int arg2、int arg3){
Main_restaurant_list.this.adapter.getFilter().filter(cs);
}
@凌驾
public void beforeTextChanged(字符序列arg0、int arg1、int arg2、int arg3){}
@凌驾
public void posterextchanged(可编辑arg0){}
});
适配器类

public class RestaurantsAdapter extends ArrayAdapter <Restaurants> implements Filterable {

    ArrayList<Restaurants> restaurantList;

    LayoutInflater vi;
    int Resource;
    ViewHolder holder;

    public RestaurantsAdapter(Context context, int resource, ArrayList<Restaurants> objects) {
        super(context, resource, objects);
        vi = (LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        Resource = resource;
        restaurantList = objects;
    }


    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // convert view = design
        View v = convertView;
        if (v == null) {
            holder = new ViewHolder();
            v = vi.inflate(Resource, null);
            holder.imageview = (ImageView) v.findViewById(R.id.ivImage);
            holder.title = (TextView) v.findViewById(R.id.title);
            holder.addr1 = (TextView) v.findViewById(R.id.addr1);
            holder.addr2 = (TextView) v.findViewById(R.id.addr2);
            holder.tel = (TextView) v.findViewById(R.id.tel);
            /*holder.mapx = (TextView) v.findViewById(R.id.mapx);*/
            /*holder.mapy = (TextView) v.findViewById(R.id.mapy);*/
            /* holder.contentid = (TextView) v.findViewById(R.id.contentid);*/
            v.setTag(holder);
        } else {
            holder = (ViewHolder) v.getTag();
        }

        //Restaurants listViewItem= filteredItemList.get(position);

        holder.imageview.setImageResource(R.drawable.ic_launcher);
        new DownloadImageTask(holder.imageview).execute(restaurantList.get(position).getImage());

        holder.title.setText(restaurantList.get(position).gettitle());
        holder.addr1.setText("주소: " + restaurantList.get(position).getaddr1());
        holder.addr2.setText(restaurantList.get(position).getAddr2());
        holder.tel.setText("전화: " + restaurantList.get(position).gettel());
        /* holder.mapx.setText( actorList.get(position).getmapx());*/
        /*holder.mapy.setText("mapx: " + actorList.get(position).getmapy());*/
        /*holder.tvChildren.setText("mapy: " + actorList.get(position).getChildren());*/
        return v;

    }

    static class ViewHolder {
        public ImageView imageview;
        public TextView title;
        public TextView addr1;
        public TextView addr2;
        public TextView tel;
        public TextView mapx;
        public TextView mapy;
        public TextView contentid;
    }


    private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
        ImageView bmImage;

        public DownloadImageTask(ImageView bmImage) {
            this.bmImage = bmImage;
        }

        protected Bitmap doInBackground(String...urls) {
            String urldisplay = urls[0];
            Bitmap mIcon11 = null;
            try {
                InputStream in = new java.net.URL(urldisplay).openStream();
                mIcon11 = BitmapFactory.decodeStream( in );
            } catch (Exception e) {
                Log.e("Error", e.getMessage());
                e.printStackTrace();
            }
            return mIcon11;
        }

        protected void onPostExecute(Bitmap result) {
            bmImage.setImageBitmap(result);
        }
    }
}
公共类RestaurantAdapter扩展ArrayAdapter实现可过滤{
ArrayList餐厅列表;
拉平机vi;
智力资源;
视窗座;
公共餐厅适配器(上下文、int资源、ArrayList对象){
超级(上下文、资源、对象);
vi=(LayoutFlater)上下文
.getSystemService(上下文布局\充气机\服务);
资源=资源;
restaurantList=对象;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
//转换视图=设计
视图v=转换视图;
如果(v==null){
holder=新的ViewHolder();
v=vi.充气(资源,空);
holder.imageview=(imageview)v.findViewById(R.id.ivImage);
holder.title=(TextView)v.findViewById(R.id.title);
holder.addr1=(TextView)v.findViewById(R.id.addr1);
holder.addr2=(TextView)v.findViewById(R.id.addr2);
holder.tel=(TextView)v.findviewbyd(R.id.tel);
/*holder.mapx=(TextView)v.findViewById(R.id.mapx)*/
/*holder.mapy=(TextView)v.findViewById(R.id.mapy)*/
/*holder.contentid=(TextView)v.findViewById(R.id.contentid)*/
v、 setTag(支架);
}否则{
holder=(ViewHolder)v.getTag();
}
//餐厅listViewItem=filteredItemList.get(位置);
holder.imageview.setImageResource(R.drawable.ic_启动器);
新建下载的ImageTask(holder.imageview).execute(restaurantList.get(position.getImage());
holder.title.setText(restaurantList.get(position.gettitle());
holder.addr1.setText(“주소: " + restaurantList.get(position.getaddr1());
holder.addr2.setText(restaurantList.get(position.getAddr2());
holder.tel.setText(“전화: “+restaurantList.get(position.gettel());
/*holder.mapx.setText(actorList.get(position.getmapx())*/
/*holder.mapy.setText(“mapx:+actorList.get(position.getmapy())*/
/*holder.tvChildren.setText(“mapy:+actorList.get(position.getChildren())*/
返回v;
}
静态类视窗夹{
公共影像视图;
公共文本视图标题;
公共文本视图addr1;
公共文本视图addr2;
公共文本视图电话;
公共文本视图mapx;
公共文本视图mapy;
公共文本视图contentid;
}
私有类DownloadImageTask扩展了AsyncTask{
图像视图bmImage;
公共下载ImageTask(ImageView bmImage){
this.bmImage=bmImage;
}
受保护位图doInBackground(字符串…URL){
字符串urldisplay=url[0];
位图mIcon11=null;
试一试{
InputStream in=newjava.net.URL(urldisplay.openStream();
mIcon11=BitmapFactory.decodeStream(in);
}捕获(例外e){
Log.e(“Error”,e.getMessage());
e、 printStackTrace();
}
返回mIcon11;
}
受保护的void onPostExecute(位图结果){
bmImage.setImageBitmap(结果);
}
}
}

您可以使用以下方法执行相同的操作

  • 将SearchView.OnQueryTextListener实现到您的活动/片段

  • 为您的活动创建菜单_activity.xml

    public boolean onCreateOptionsMenu(Menu menu) {
            MenuInflater inflater = getMenuInflater();
            inflater.inflate(R.menu.menu_activity, menu);
            return super.onCreateOptionsMenu(menu);
        }
    
    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        MenuItem searchItem = menu.findItem(R.id.action_search);
        searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
        searchView.setOnQueryTextListener(this);
        searchView.setOnCloseListener(this);
        return super.onPrepareOptionsMenu(menu);
    } 
    
      @Override
    public boolean onQueryTextChange(String query) {
        if (query.length() == 0) {
            searchView.setIconified(true);
            searchView.clearFocus();
            searchView.setQueryHint("some_hint_text");
        } else {
            ArrayList<Restaurants> items = SearchUtil.searchRestraunt(query);
            if (items != null && items.size() != 0) {
                Main_restaurant_list.this.adapter.swapData(items);
            }
            return false;
        }
        return false;
    }
    
    
    

在活动中初始化此菜单

public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.menu_activity, menu);
        return super.onCreateOptionsMenu(menu);
    }

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    MenuItem searchItem = menu.findItem(R.id.action_search);
    searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
    searchView.setOnQueryTextListener(this);
    searchView.setOnCloseListener(this);
    return super.onPrepareOptionsMenu(menu);
} 

  @Override
public boolean onQueryTextChange(String query) {
    if (query.length() == 0) {
        searchView.setIconified(true);
        searchView.clearFocus();
        searchView.setQueryHint("some_hint_text");
    } else {
        ArrayList<Restaurants> items = SearchUtil.searchRestraunt(query);
        if (items != null && items.size() != 0) {
            Main_restaurant_list.this.adapter.swapData(items);
        }
        return false;
    }
    return false;
}
public boolean oncreateoptions菜单(菜单菜单){
MenuInflater充气机=getMenuInflater();
充气机。充气(右菜单。菜单活动,菜单);
返回super.onCreateOptions菜单(菜单);
}
@凌驾
公共布尔值OnPrepareOptions菜单(菜单){
MenuItem searchItem=menu.findItem(R.id.action\u search);
searchView=(searchView)MenuItemCompat.getActionView(searchItem);
setOnQueryTextListener(这个);
searchView.setOnCloseListener(这个);
返回super.onPrepareOptions菜单(菜单);
} 
@凌驾
公共布尔onQueryTextChange(字符串查询){
if(query.length()==0){
searchView.setIconified(true);
searchView.clearFocus();
setQueryHint(“一些提示文本”);
}否则{
arraylistitems=SearchUtil.searchrestarun(查询);
if(items!=null&&items.size()!=0){
主餐厅列表.this.adapter.swapData(