C#列表问题(Android/Monodroid ListView搜索)

C#列表问题(Android/Monodroid ListView搜索),c#,android,list,android-listview,xamarin,C#,Android,List,Android Listview,Xamarin,我在C#中使用Monodroid进行Android开发 我正在尝试创建一个搜索功能。如果用户键入一个搜索词,它会工作,但是当按下退格键并且文本框中没有任何内容时(strTheFilter==“”),我的listview不会被更新 从调试中我可以看到,当用户删除搜索项时,m_lCallSigns计数为零,因此它没有添加任何内容。bNeedToFilter已在搜索无效时使用。为什么要这样做?它在该类的构造函数中初始化,初始化后调用该函数 ListAdapter.cs public vo

我在C#中使用Monodroid进行Android开发

我正在尝试创建一个搜索功能。如果用户键入一个搜索词,它会工作,但是当按下退格键并且文本框中没有任何内容时(strTheFilter==“”),我的listview不会被更新

从调试中我可以看到,当用户删除搜索项时,m_lCallSigns计数为零,因此它没有添加任何内容。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);
    }
ListAdapter.cs
public void DisplayNewData(列出新项目)
{
m_lCallSigns=新的_项目;
NotifyDataSetChanged();
}
public void getcallsignsfilter(字符串strTheFilter、bool bNeedToFilter)
{
strTheFilter=strTheFilter.ToLower();
List lFiltered=新列表();
foreach(m_lCallSigns中的CallSignItem项)
{
if(item.strCallSign.ToLower().包含(strTheFilter)
||!bNeedToFilter)
{
l过滤。添加(项目);
}
}
显示新数据(过滤);
}
该函数是从我的活动类调用的

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);
        }
Activity.cs
/// 
///使用搜索条件更新listview(操作侦听器)。
/// 
///发送者。
///争论。
私有void InputSearchContextChanged(对象发送方,System.EventArgs args args)
{
字符串strearch=m_etSearch.Text;
bool bNeedToFilter=true;
//如果是空的,我们需要完整的列表
if(strSearch.Count()==0)
{
bNeedToFilter=false;
}
//EditText定义了7个字符的限制
//告诉用户
如果(strSearch.Count()>=7)
{
Utils.DisplayDialogMessage(“搜索”,
“输入的字符不能超过7个。”,
是的,
"",
“好的”,
假,,
这),;
}  
GetCallSignsFiltered(strSearch,bNeedToFilter);
}

每次筛选时,都会将筛选后的列表传递给DisplayNewData()

DisplayNewData(过滤);
public void DisplayNewData(列出新项目)
{
m_lCallSigns=新的_项目;
NotifyDataSetChanged();
}

然后将过滤后的列表分配给m_lCallSigns。m_lCallSigns也是筛选时使用的“主”列表。您需要保留两份副本,一份未过滤的母版副本和一份用于显示的过滤副本。

谢谢Jason!问题解决了

我拿了一份名单

public List<CallSignItem> m_lCallSigns_copy;

m_lCallSigns_copy = new List<CallSignItem>(m_lCallSigns);
然后更新:

public void DisplayNewData(List<CallSignItem> new_items)
        {
            m_lCallSigns = new_items;
            NotifyDataSetChanged();
        }
public void DisplayNewData(列出新项目)
{
m_lCallSigns=新的_项目;
NotifyDataSetChanged();
}

我正在尝试创建搜索功能
-使用LINQ。C#不是java。当搜索框为空时,您是否使用调试器单步执行foreach循环?是的,如果我在搜索框中键入“E”,它将过滤所有内容。然后删除E只会留下过滤后的结果。不是原始列表。就好像m_lCallSigns正在以某种方式删除未过滤的内容。@JP29您能为我提供上述示例的完整源代码吗,因为我正试图在我的应用程序中实现这一点
            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();
        }