2016-03-15 99 views
1

我目前有ListView,其中每個項目都有一個TextView和一個複選框。在ListView之上是一個EditText來搜索ListView。當用戶搜索了某些內容並單擊其中一個CheckBox或在給定結果列表中滾動時,我希望鍵盤消失。我怎樣才能做到這一點?點擊ListView中的複選框時隱藏鍵盤

我已經使用InputMethodManager處理了其他活動中的鍵盤,但由於EditText超出了其範圍,因此無法在適配器內調用它,因此無法在使用適配器的活動中調用它,因爲就像它涉及點擊複選框時沒有任何變化一樣。

任何人都可以指向正確的方向嗎?

在此先感謝

回答

1

1)傳遞一個接口,適配器

class MyActivity { 
     public interface OnCheckBoxClickListener{ 
      public void OnCheckboxClicked(); 
     } 

     public class MyOnCheckBoxClickListener :OnCheckBoxClickListener { 

      private WeakReference<Context> mContext; 

      public MyOnCheckBoxClickListener(Context context){ 
       mContext = new WeakReference<Context>(context); 
      } 

      public void OnCheckboxClicked(){ 
      Context context = null; 
      mContext.TryGetTarget(out context); 

      var editText = (context as Activity).FindViewById<EditText>(Resource.Id.edittextId); 
      editText.ClearFocus(); 
      } 
     } 

     YourListAdapter adapter = new YourListAdapter(new MyOnCheckBoxClickListener(this)); 
} 

2)然後:

private void hideKeyboard() { 
    View view = this.getCurrentFocus(); 
    if (view != null) { 
     view.clearFocus(); 
     InputMethodManager inputManager = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE); 
     inputManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); 
    } 
} 

您可以使用它的ListView:

listView.setOnScrollListener(new AbsListView.OnScrollListener() { 
    @Override 
    public void onScrollStateChanged(AbsListView view, int scrollState) { 

    } 

    @Override 
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 
     hideKeyboard(); 
    } 
}); 

或複選框您的適配器:

class YourListAdapter { 

    OnCheckBoxClickListener mListener; 

     public override View GetView(int position, View convertView, ViewGroup parent) { 
      //code for view generation 
      var checkbox = convertView.FindViewById<Checkbox>(Resource.Id.YourCheckbox); 
      checkbox.Click += (sender, args) => { 
       mListener.OnCheckboxClicked(); 
      } 
     } 
    } 

此外,您可以使用委託實現同樣的事情。

+1

我應該使用什麼代碼來關閉鍵盤呢?通常我使用(InputMethodManager)this.GetSystemService(Context.InputMethodService),但由於沒有Context,所以無法使用它。 –

+0

您在您的活動中創建接口,然後將其傳遞給適配器構造函數 – Greensy

+1

它說我不能在布爾值上使用+ =運算符 –

0

當您需要隱藏鍵盤時,您可以使用此功能。在

checkBox.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     hideKeyboard(); 
     ... 
    } 
}); 
+0

是的,我知道。但是我不能在適配器中調用this.getCurrentFocus()。 –

+0

然後你需要傳遞上下文到你的適配器 –

+0

我不認爲這是最佳實踐,是嗎? –