搜索自定义列表视图

问题描述:

我很好奇如何使用可搜索的自定义适配器创建列表视图。我遵循教程并设置了一切,但是当我尝试在EditText中输入任何内容时,该应用程序崩溃。现在我知道为什么应用程序崩溃了,我只是不知道如何解决它。搜索自定义列表视图

下面是代码我的MainActivity:

@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 

      } 

     }; 

这里是代码,我的自定义列表视图适配器:

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

} 

原因的应用程序崩溃时,我尝试搜索,是因为在TextWatcher中,这一行:adapter.getFilter().filter(text);适配器仅在我的主要活动的顶部定义,但它不与我在ALL的listview一起使用。我卡在这里,真的不知道用什么来代替adapter,因为ItemIDAdapter不起作用。谢谢你的帮助!

更换

setListAdapter(new ItemIDAdapter(ctx, R.layout.idslistitem, ids, options, icons)); 

adapter = new ItemIDAdapter(ctx, R.layout.idslistitem, ids, options, icons) 

setListAdapter(adapter); 
+0

这固定的崩溃!非常感谢!但是,无论何时我在编辑文本中输入内容,然后单击键盘上的“完成”,都不会有任何反应。任何想法为什么? – user1798956

+0

@ user1798956:您是否尝试过调试以找出原因? – ChiefTwoPencils

+0

我已经尝试过了,但它只是一遍又一遍地传递了同样的东西,它说'I/endeffect(5461):AbsListView.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):AbsListView.onMeasure(),getWidth()= 1080,getHeight()= 914,this = android.widget.ListView {424f6b80 VFED.VC. ......一世。 0,0-1080,914#102000a android:id/list} ' – user1798956