android自定义列表视图搜索

时间:2017-04-27 13:49:13

标签: android listview search

我一直在尝试将搜索功能添加到自定义列表视图中。 即使我试图遵循许多答案或教程,我也无法将它们反映到我的适配器类。你能帮我解决一下搜索功能吗? 提前谢谢。

主要课程

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) {}
            });

适配器类

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);
        }
    }
}

1 个答案:

答案 0 :(得分:0)

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

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

  • 为您的活动创建menu_activity.xml。

    <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/action_search" android:icon="@android:drawable/ic_menu_search" app:actionViewClass="android.support.v7.widget.SearchView" app:showAsAction="always"/> </menu>

在您的活动中初始化此菜单。

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 void swapData(List<Restaurants> items) {
    restaurantList = items;
    notifyDataSetChanged();
}
相关问题