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

时间:2014-03-31 15:55:18

标签: c# android list android-listview xamarin

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

我正在尝试创建搜索功能。如果用户键入搜索词,则可以使用,但是当按下退格键并且文本框中没有任何内容时(strTheFilter ==""),我的列表视图没有被更新。

从调试中我可以看到当用户删除搜索词时m_lCallSigns Count为零,因此它不添加任何内容。当搜索什么都没有时,使用了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);
        }

2 个答案:

答案 0 :(得分:1)

每次过滤时,都会将过滤的列表传递给DisplayNewData()

DisplayNewData(lFiltered);

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

然后将过滤的列表分配给m_lCallSigns。 m_lCallSigns也是&#34; master&#34;过滤时使用的列表。您需要保留两个副本,一个未过滤的主副本和一个用于显示的过滤副本。

答案 1 :(得分: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();
        }