Android 搜索自定义listview
我很好奇如何使用自定义适配器使listview可搜索。我按照一个教程进行了设置,但是当我试图在EditText中键入任何内容时,应用程序崩溃了。现在我知道了应用程序崩溃的原因,我只是不知道如何修复它 以下是我的主要活动的代码:Android 搜索自定义listview,android,listview,search,adapter,textwatcher,Android,Listview,Search,Adapter,Textwatcher,我很好奇如何使用自定义适配器使listview可搜索。我按照一个教程进行了设置,但是当我试图在EditText中键入任何内容时,应用程序崩溃了。现在我知道了应用程序崩溃的原因,我只是不知道如何修复它 以下是我的主要活动的代码: @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Context ctx = getAp
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Context ctx = getApplication();
Resources res = ctx.getResources();
String[] options = res.getStringArray(R.array.item_ids);
String[] ids = res.getStringArray(R.array.item_names);
TypedArray icons = res.obtainTypedArray(R.array.item_images);
setListAdapter(new ItemIDAdapter(ctx, R.layout.idslistitem, ids, options, icons));
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Get the options menu view from menu.xml in menu folder
getSupportMenuInflater().inflate(R.menu.items_menu, menu);
// Locate the EditText in menu.xml
editsearch = (EditText) menu.findItem(R.id.menu_search).getActionView();
// Capture Text in EditText
editsearch.addTextChangedListener(textWatcher);
// Show the search menu item in menu.xml
MenuItem menuSearch = menu.findItem(R.id.menu_search);
menuSearch.setOnActionExpandListener(new OnActionExpandListener() {
// Menu Action Collapse
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
// Empty EditText to remove text filtering
editsearch.setText("");
editsearch.clearFocus();
return true;
}
// Menu Action Expand
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
// Focus on EditText
editsearch.requestFocus();
// Force the keyboard to show on EditText focus
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
return true;
}
});
// Show the settings menu item in menu.xml
MenuItem menuSettings = menu.findItem(R.id.home);
// Capture menu item clicks
menuSettings.setOnMenuItemClickListener(new OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
Intent intent2 = new Intent(ItemId.this, Home.class);
startActivity(intent2);
return true;
}
});
return true;
}
// EditText TextWatcher
private TextWatcher textWatcher = new TextWatcher() {
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
String text = editsearch.getText().toString()
.toLowerCase(Locale.getDefault());
adapter.getFilter().filter(text);
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
int arg3) {
// TODO Auto-generated method stub
}
@Override
public void onTextChanged(CharSequence arg0, int arg1, int arg2,
int arg3) {
// TODO Auto-generated method stub
}
};
下面是自定义listview适配器的代码:
public class ItemIDAdapter extends ArrayAdapter<String> {
public LayoutInflater mInflater;
public String[] mStrings;
public String[] mIds;
public TypedArray mIcons;
public int mViewResourceId;
ArrayAdapter<String> adapter;
public ItemIDAdapter(Context ctx, int viewResourceId,
String[] strings, String[] ids, TypedArray icons) {
super(ctx, viewResourceId, strings);
mInflater = (LayoutInflater)ctx.getSystemService(
Context.LAYOUT_INFLATER_SERVICE);
mStrings = strings;
mIds = ids;
mIcons = icons;
mViewResourceId = viewResourceId;
}
@Override
public int getCount() {
return mStrings.length;
}
@Override
public String getItem(int position) {
return mStrings[position];
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
convertView = mInflater.inflate(mViewResourceId, null);
ImageView iv = (ImageView)convertView.findViewById(R.id.option_icon);
iv.setImageDrawable(mIcons.getDrawable(position));
TextView tv = (TextView)convertView.findViewById(R.id.option_text);
tv.setText(mStrings[position]);
TextView tv1 = (TextView)convertView.findViewById(R.id.itemids);
tv1.setText(mIds[position]);
return convertView;
}
}
public类itemidapter扩展了ArrayAdapter{
公共布局更扁平,更扁平;
公共字符串[]mStrings;
公共字符串[]mIds;
公共类型Darray mIcons;
公共int mViewResourceId;
阵列适配器;
公共项IDAdapter(上下文ctx,int-viewResourceId,
字符串[]字符串、字符串[]ID、类型(Darray图标){
超级(ctx、viewResourceId、字符串);
mInflater=(LayoutInflater)ctx.getSystemService(
上下文。布局(充气机和服务);
mStrings=字符串;
mIds=ids;
mIcons=图标;
mViewResourceId=viewsourceid;
}
@凌驾
public int getCount(){
返回mStrings.length;
}
@凌驾
公共字符串getItem(int位置){
返回mStrings[位置];
}
@凌驾
公共长getItemId(int位置){
返回位置;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
convertView=mInflater.inflate(mViewResourceId,null);
ImageView iv=(ImageView)convertView.findViewById(R.id.option_图标);
iv.setImageDrawable(mIcons.getDrawable(位置));
TextView tv=(TextView)convertView.findViewById(R.id.option\u text);
tv.setText(mStrings[position]);
TextView tv1=(TextView)convertView.findViewById(R.id.ItemId);
tv1.setText(中间[位置]);
返回视图;
}
}
当我尝试搜索时,应用程序崩溃的原因是因为在TextWatcher中,这一行:adapter.getFilter().filter(text)代码>适配器仅在我的主要活动顶部定义,但它根本不与我的listview一起使用。我被困在这里,真的不知道用什么替换适配器,因为itemidapter不工作。谢谢你的帮助 更换
setListAdapter(new ItemIDAdapter(ctx, R.layout.idslistitem, ids, options, icons));
与
这修正了碰撞!非常感谢!但是,每当我在编辑文本中键入内容,并单击键盘上的“完成”时,什么都不会发生。你知道为什么吗?我已经试过了,但它只是一遍又一遍地用同样的东西对log cat进行垃圾处理,上面写着I/endeffect(5461):AblistView.onMeasure(),getWidth()=1080,getHeight()=914,this=android.widget.ListView{424f6b80 VFED.VC.\102000a android:id/list}08-19 20:24:04.844:I/endeffect(5461):AblistView.onMeasure(),getWidth()=1080,getHeight()=914,this=android.widget.ListView{424f6b80 VFED.VC…….I.0,0-1080914 35; 102000a android:id/list}
有人知道吗?我完全迷路了,不知道该怎么办
adapter = new ItemIDAdapter(ctx, R.layout.idslistitem, ids, options, icons)
setListAdapter(adapter );