2013-08-20 4 views
0

사용자 지정 어댑터를 검색 할 수있는 목록보기를 만드는 방법이 궁금했습니다. 튜토리얼을 따라 모든 설정을했는데 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가 작동하지 않기 때문입니다. 당신의 도움을 주셔서 감사합니다!

답변

1

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

setListAdapter(adapter); 
+0

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

이이 충돌을 고정 교체! 정말 고마워! 그러나 편집 텍스트에 내용을 입력하고 키보드에서 "완료"를 클릭해도 아무런 변화가 없습니다. 왜 그런가? – 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 : AbsListView.onMeasure(), getWidth() = 1080, getHeight() = 914, this = android.widget.ListView {424f6b80 VFED.VC. ......나는. 0,0-1080,914 # 102000a android : id/list} ' – user1798956

관련 문제