NotifyDataSetChanged 不工作 xamarin.android
NotifyDataSetChanged not working xamarin.android
例如列表中有年龄为
的行
在搜索 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();
}
On searching 45 you get the result filtered as 45. but clicking on it results on showing age from 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;
}
例如列表中有年龄为
的行在搜索 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();
}
On searching 45 you get the result filtered as 45. but clicking on it results on showing age from 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;
}