NotifyDataSetChanged不工作xamarin.android

NotifyDataSetChanged不工作xamarin.android,xamarin.android,notifydatasetchanged,Xamarin.android,Notifydatasetchanged,例如,列表中有带年龄的行 搜索45时,您将得到过滤为45的结果。但点击它会显示年龄从1开始。这就像位置不会随着时间的推移而改变,而是使用原始的ArrayList适配器位置 我的代码如下: public class MainActivity : Activity { private List<Friend> mFriends; private ListView mListView; private EditText mSearch; private L

例如,列表中有带年龄的行

搜索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();


    }
公共类main活动:活动
{
私人名单;
私有列表视图;
私人编辑研究;
私人线路布局mContainer;
私人住宅区;
私人布尔动画制作不当;
私人的友谊;
创建时受保护的覆盖无效(捆绑包)
{
base.OnCreate(bundle);
//从“主”布局资源设置视图
SetContentView(Resource.Layout.Main);
mListView=findviewbyd(Resource.Id.listView);
mSearch=findviewbyd(Resource.Id.etSearch);
mContainer=findviewbyd(Resource.Id.llContainer);
mSearch.Alpha=0;
mSearch.TextChanged+=mSearch\u TextChanged;
mFriends=新列表();
添加(新朋友{FirstName=“Bob”,LastName=“Smith”,Age=“33”,Gender=“Male”});
添加(新朋友{FirstName=“Tom”,LastName=“Smith”,Age=“45”,Gender=“Male”});
添加(新朋友{FirstName=“Julie”,LastName=“Smith”,Age=“2020”,Gender=“Unknown”});
添加(新朋友{FirstName=“Molly”,LastName=“Smith”,Age=“21”,Gender=“Female”});
添加(新朋友{FirstName=“Joe”,LastName=“Lopez”,Age=“22”,Gender=“Male”});
添加(新朋友{FirstName=“Ruth”,LastName=“White”,Age=“81”,Gender=“Female”});
添加(新朋友{FirstName=“Sally”,LastName=“Johnson”,Age=“54”,Gender=“Female”});
mAdapter=new FriendsAdapter(this,Resource.Layout.row\u friends,mFriends);
mListView.Adapter=mAdapter;
mListView.ItemClick+=mListView\u ItemClick;
}
私有void MListView_ItemClick(对象发送方,AdapterView.ItemClickEventArgs e)
{
var friend=mFriends[e.Position];
Toast.MakeText(this,friend.Age,ToastLength.Short).Show();
}
void mSearch_TextChanged(对象发送者,Android.Text.textchangedventargs e)
{
列出searchedFriends=(来自mFriends中的friend)
其中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)
选择friend.ToList();
mAdapter=new FriendsAdapter(这个,Resource.Layout.row\u friend,searched friends);
mListView.Adapter=mAdapter;
mAdapter.NotifyDataSetChanged();
}
我正在做这个例子

在搜索45时,你会得到过滤为45的结果。但是点击它会显示年龄从1开始

这段代码没有问题,因为您已经为
mListView
重置了适配器,所以不需要添加类似
mAdapter.NotifyDataSetChanged();
的代码。在这里,这是一个全新的适配器,
NotifyDataSetChanged
在适配器中的数据更改时工作

所以问题的真正原因是您使用了code
var-friend=mFriends[e.Position];
,您使用
列表视图中的单击位置来查找
mFriends
列表中的朋友。该位置是在向此列表添加数据时设置的,但查询后需要在
searchedFriends
中查找朋友

例如:

私人列表搜索好友;
私有void MListView_ItemClick(对象发送方,AdapterView.ItemClickEventArgs e)
{
朋友;
if(searchedFriends==null | | searchedFriends.Count==mFriends.Count)
{
朋友=朋友[e.位置];
}
其他的
{
朋友=搜索的朋友[e.位置];
}
Toast.MakeText(this,friend.Age,ToastLength.Short).Show();
}
void mSearch_TextChanged(对象发送者,Android.Text.textchangedventargs e)
{
searchedFriends=(来自mFriends中的friend)
其中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)
选择friend.ToList();
mAdapter=new FriendsAdapter(这个,Resource.Layout.row\u friend,searched friends);
mListView.Adapter=mAdapter;
}