【发布时间】:2015-10-09 07:58:45
【问题描述】:
我有带有自定义适配器的Listview。我将Searchview 放在活动栏中以过滤Listview 中的项目。 Mycustom Listview 和 Searchview 工作正常。
我希望我的Listview 以空开头,但只根据输入Searchview 显示项目
我的代码示例
主活动
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv = (ListView) findViewById(R.id.listView);
btnsrc = (Button) findViewById(R.id.btnSearch);
SeaFoodData food = new SeaFoodData(this);
ArrayList<SeaFood> sList = new ArrayList<SeaFood>();
try {
sList = food.GetSeaFood();
} catch (JSONException e) {
e.printStackTrace();
}
sfAdapter = new SeaFoodAdapter(MainActivity.this, sList);
lv.setAdapter(sfAdapter);
lv.setTextFilterEnabled(true);
filter = sfAdapter.getFilter();
}
@Override
public boolean onQueryTextChange(String newText)
{
filter.filter(newText);
return true;
}
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
// Inflate menu to add items to action bar if it is present.
inflater.inflate(R.menu.menu_main, menu);
// Associate searchable configuration with the SearchView
SearchManager searchManager =
(SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView searchView =
(SearchView) menu.findItem(R.id.action_search).getActionView();
searchView.setSearchableInfo(
searchManager.getSearchableInfo(getComponentName()));
sv = (SearchView) menu.findItem(R.id.action_search).getActionView();
searchView.setQueryHint("Ara...");
setupSearchView();
return true;
}
private void setupSearchView()
{
sv.setOnQueryTextListener(this);
}
我的适配器
public SeaFoodAdapter(Context ctx, ArrayList<SeaFood> foodList) {
super();
this.context = ctx;
this.seaFoodArrayList = foodList;
}
public class SeaFoodHolder
{
TextView food;
TextView description;
ImageView rsm;
}
public Filter getFilter() {
return new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
final FilterResults oReturn = new FilterResults();
final ArrayList<SeaFood> results = new ArrayList<SeaFood>();
if (orig == null)
orig = seaFoodArrayList;
if (constraint != null) {
if (orig != null && orig.size() > 0) {
for (final SeaFood g : orig) {
if (g.getName().toLowerCase()
.contains(constraint.toString()))
results.add(g);
}
}
oReturn.values = results;
}
return oReturn;
}
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint,
FilterResults results) {
seaFoodArrayList = (ArrayList<SeaFood>) results.values;
notifyDataSetChanged();
}
};
}
public void notifyDataSetChanged() {
super.notifyDataSetChanged();
}
@Override
public int getCount() {
return seaFoodArrayList.size();
}
@Override
public SeaFood getItem(int position) {
return seaFoodArrayList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
SeaFoodHolder holder;
if(convertView==null)
{
convertView=LayoutInflater.from(context).inflate(R.layout.row, parent, false);
holder=new SeaFoodHolder();
holder.food=(TextView) convertView.findViewById(R.id.tvFood);
holder.description=(TextView) convertView.findViewById(R.id.tvDescription);
holder.rsm=(ImageView) convertView.findViewById(R.id.warnimage);
convertView.setTag(holder);
}
else
{
holder=(SeaFoodHolder) convertView.getTag();
}
holder.food.setText(seaFoodArrayList.get(position).getName());
holder.description.setText(String.valueOf(seaFoodArrayList.get(position).getDescription()));
if (seaFoodArrayList.get(position).getimgPath().equals("0") ) {
holder.rsm.setImageResource(R.drawable.error);
} else {
holder.rsm.setImageResource(R.drawable.check);
}
if (position % 2 == 0) {
convertView.setBackgroundColor(Color.parseColor("#E3F2FD"));
} else {
convertView.setBackgroundColor(Color.parseColor("#90CAF9"));
}
View vi = convertView;
vi.setOnCreateContextMenuListener(this);
return convertView;
}
public void onCreateContextMenu(ContextMenu contextMenu, View view, ContextMenu.ContextMenuInfo contextMenuInfo) {
// empty implementation
}
已解决
我解决了这个问题。
首先,
在设置适配器后,我在 On Create 函数中隐藏了我的 Listview。
sfAdapter = new SeaFoodAdapter(MainActivity.this, sList);
lv.setAdapter(sfAdapter);
lv.setTextFilterEnabled(true);
filter = sfAdapter.getFilter();
lv.setVisibility(View.GONE);
那么,
在onQueryTextChange函数中根据搜索查询显示ListView
@Override
public boolean onQueryTextChange(String newText)
{
if(newText == null || newText.equals(""))
{
lv.setVisibility(View.GONE);
}else{
lv.setVisibility(View.VISIBLE);
}
filter.filter(newText);
return true;
}
希望这对某人有所帮助。感谢您的帮助。
【问题讨论】:
-
在ListView中初始加载空搜索列表
-
我最初加载的是空列表,但打字时无法填写
-
至少贴出你的适配器代码
-
1.请粘贴您的适配器代码。 2.您计划显示的数据在哪里,您是从数据库还是服务器动态访问它?或者您已经在某个列表中拥有数据?
-
我粘贴了代码。我从 JSON 文件访问数据
标签: android listview searchview custom-adapter