NotifyDataSetChanged无法正常工作xamarin.android

时间:2018-02-15 08:11:33

标签: xamarin.android notifydatasetchanged

例如,list包含年龄

的行

在搜索45时,你得到的结果被过滤为45.但点击它会导致从1开始显示年龄。就像年龄的位置没有变化但是使用原始的ArrayList适配器位置。

我的代码如下,

 public class MainActivity : Activity
{
    private List<Friend> mFriends;
    private ListView mListView;
    private EditText mSearch;
    private LinearLayout mContainer;
    private bool mAnimatedDown;
    private bool mIsAnimating;
    private FriendsAdapter mAdapter;

    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);

        // Set our view from the "main" layout resource
        SetContentView(Resource.Layout.Main);
        mListView = FindViewById<ListView>(Resource.Id.listView);
        mSearch = FindViewById<EditText>(Resource.Id.etSearch);
        mContainer = FindViewById<LinearLayout>(Resource.Id.llContainer);

        mSearch.Alpha = 0;
        mSearch.TextChanged += mSearch_TextChanged;

        mFriends = new List<Friend>();
        mFriends.Add(new Friend { FirstName = "Bob", LastName = "Smith", Age = "33", Gender = "Male" });
        mFriends.Add(new Friend { FirstName = "Tom", LastName = "Smith", Age = "45", Gender = "Male" });
        mFriends.Add(new Friend { FirstName = "Julie", LastName = "Smith", Age = "2020", Gender = "Unknown" });
        mFriends.Add(new Friend { FirstName = "Molly", LastName = "Smith", Age = "21", Gender = "Female" });
        mFriends.Add(new Friend { FirstName = "Joe", LastName = "Lopez", Age = "22", Gender = "Male" });
        mFriends.Add(new Friend { FirstName = "Ruth", LastName = "White", Age = "81", Gender = "Female" });
        mFriends.Add(new Friend { FirstName = "Sally", LastName = "Johnson", Age = "54", Gender = "Female" });

        mAdapter = new FriendsAdapter(this, Resource.Layout.row_friend, mFriends);
        mListView.Adapter = mAdapter;


        mListView.ItemClick += MListView_ItemClick;
    }

    private void MListView_ItemClick(object sender, AdapterView.ItemClickEventArgs e)
    {
        var friend = mFriends[e.Position];


        Toast.MakeText(this, friend.Age, ToastLength.Short).Show();
    }

    void mSearch_TextChanged(object sender, Android.Text.TextChangedEventArgs e)
    {

        List<Friend> searchedFriends = (from friend in mFriends
                                        where friend.FirstName.Contains(mSearch.Text, StringComparison.OrdinalIgnoreCase) || friend.LastName.Contains(mSearch.Text, StringComparison.OrdinalIgnoreCase)
                                        || friend.Age.Contains(mSearch.Text, StringComparison.OrdinalIgnoreCase) || friend.Gender.Contains(mSearch.Text, StringComparison.OrdinalIgnoreCase)
                                        select friend).ToList<Friend>();

        mAdapter = new FriendsAdapter(this, Resource.Layout.row_friend, searchedFriends);
        mListView.Adapter = mAdapter;
        mAdapter.NotifyDataSetChanged();


    }

我正在研究这个例子 >>Xamarin 15 - Searching a Listview using LINQ

1 个答案:

答案 0 :(得分:1)

  

在搜索45时,您将结果筛选为45.但点击它会导致显示年龄为1。

该代码没有问题,因为您已经为mListView重置了适配器,所以您不需要在此处添加mAdapter.NotifyDataSetChanged();等代码,它不需要完全是一个新的适配器,NotifyDataSetChanged在该适配器中的数据发生变化时起作用。

因此,问题的真正原因是您使用了代码var friend = mFriends[e.Position];,您在ListView中使用了点击位置来查找mFriends列表中的朋友。将数据添加到此列表时会设置位置,但您需要在查询后在searchedFriends中找到朋友。

例如:

private List<Friend> searchedFriends;
private void MListView_ItemClick(object sender, AdapterView.ItemClickEventArgs e)
{
    Friend friend;
    if(searchedFriends == null || searchedFriends.Count == mFriends.Count)
    {
        friend = mFriends[e.Position];
    }
    else
    {
        friend = searchedFriends[e.Position];
    }

    Toast.MakeText(this, friend.Age, ToastLength.Short).Show();
}

void mSearch_TextChanged(object sender, Android.Text.TextChangedEventArgs e)
{

    searchedFriends = (from friend in mFriends
                                    where friend.FirstName.Contains(mSearch.Text, StringComparison.OrdinalIgnoreCase) || friend.LastName.Contains(mSearch.Text, StringComparison.OrdinalIgnoreCase)
                                    || friend.Age.Contains(mSearch.Text, StringComparison.OrdinalIgnoreCase) || friend.Gender.Contains(mSearch.Text, StringComparison.OrdinalIgnoreCase)
                                    select friend).ToList<Friend>();


    mAdapter = new FriendsAdapter(this, Resource.Layout.row_friend, searchedFriends);
    mListView.Adapter = mAdapter;
}