我在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);
}
答案 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();
}