2014-03-31 2 views
1

C#에서 Android 개발 용 Monodroid를 사용하고 있습니다.C#의 목록 문제 (Android/Monodroid ListView 검색)

검색 기능을 만들려고합니다. 사용자가 검색어를 입력하면 백 스페이스를 누르고 텍스트 상자 (strTheFilter == "")에 아무 것도 없어도 내 목록보기가 업데이트되지 않습니다.

디버깅에서 나는 사용자가 검색어를 제거 할 때 m_lCallSigns Count가 0이라는 것을 알 수 있으므로 아무 것도 추가하지 않습니다. 검색이 아무것도없는 경우 bNeedToFilter가 사용되었습니다. 왜이 일을하는거야? 이 클래스의 생성자에서 초기화되고 함수는 초기화 후에 호출됩니다.

ListAdapter.cs 

    public void DisplayNewData(List<CallSignItem> new_items) 
    { 
     m_lCallSigns=new_items; 
     NotifyDataSetChanged(); 
    } 

    public void GetCallSignsFiltered(String strTheFilter, bool bNeedToFilter) 
    { 
     strTheFilter = strTheFilter.ToLower(); 

     List<CallSignItem> lFiltered = new List<CallSignItem>(); 

     foreach (CallSignItem item in m_lCallSigns) 
     { 
      if (item.strCallSign.ToLower().Contains(strTheFilter) 
       || !bNeedToFilter) 
      { 
       lFiltered.Add(item); 
      } 
     } 

     DisplayNewData(lFiltered); 
    } 

이 함수는 내 액티비티 클래스에서 호출됩니다.

Activity.cs 


     /// <summary> 
     /// Updates the listview with search criteria (Action Listener). 
     /// </summary> 
     /// <param name="sender">Sender.</param> 
     /// <param name="args">Arguments.</param> 
     private void InputSearchOnTextChanged(object sender, System.EventArgs args) 
     { 
      String strSearch = m_etSearch.Text; 

      bool bNeedToFilter = true; 

      // If it's empty, we need the full list 
      if (strSearch.Count() == 0) 
      { 
       bNeedToFilter = false; 
      } 

      // The EditText has a limit of 7 chars defined 
      // in xml. Tell the user 
      if (strSearch.Count() >= 7) 
      { 
       Utils.DisplayDialogMessage ("Search", 
        "You cannot enter more than 7 characters.", 
        true, 
        "", 
        "Ok", 
        false, 
        this); 
      } 

      listAdapter.GetCallSignsFiltered(strSearch, bNeedToFilter); 
     } 
+1

'나는 노력하고 있어요 검색 기능 만들기 - LINQ를 사용하십시오. C#은 자바가 아닙니다. –

+0

검색 상자가 비어있을 때 디버거를 사용하여 foreach 루프를 단계별로 실행 했습니까? – Jason

+1

예 검색 창에 "E"를 입력하면 모든 항목이 필터링됩니다. 그런 다음 E를 제거하면 필터링 된 결과 만 남습니다. 원래 목록이 아닙니다. 마치 m_lCallSigns가 필터링되지 않은 것들이 어떻게 든 제거되는 것과 같습니다. – JP29

답변

1

당신이, 당신은() 다음 m_lCallSigns에 필터링 목록을 지정

DisplayNewData(lFiltered); 

public void DisplayNewData(List<CallSignItem> new_items) 
{ 
    m_lCallSigns=new_items; 
    NotifyDataSetChanged(); 
} 

을 DisplayNewData에 필터링 목록을 전달하는 필터링 할 때마다. m_lCallSigns는 필터링 할 때 사용하는 "마스터"목록이기도합니다. 필터링되지 않은 마스터 복사본 하나와 디스플레이에 사용되는 필터링 된 복사본 두 개를 유지해야합니다.

1

제이슨 감사합니다! 문제가 해결되었습니다.

나는 목록의 사본을 가져 갔다. 복사 된 목록을

public List<CallSignItem> m_lCallSigns_copy; 

m_lCallSigns_copy = new List<CallSignItem>(m_lCallSigns); 

루프 때문에 인덱스 예외는 지금까지 발생되지 않으며 우리는 항상 초기 인구 값을 읽고 : 업데이트 다음

  foreach (CallSignItem item in m_lCallSigns_copy) 
      { 
       if (item.strCallSign.ToLower().Contains(strTheFilter)) 
       { 
        lFiltered.Add(item); 
       } 
      } 

을 :

public void DisplayNewData(List<CallSignItem> new_items) 
     { 
      m_lCallSigns = new_items; 
      NotifyDataSetChanged(); 
     }