我一直在尝试将搜索功能添加到自定义列表视图中。 即使我试图遵循许多答案或教程,我也无法将它们反映到我的适配器类。你能帮我解决一下搜索功能吗? 提前谢谢。
主要课程
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);
}
}
}
答案 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();
}