2017-10-15 50 views
2

我使用的是从JoeRock的Channel.The问题的例子存在,当我使用过滤列表视图过滤后点击列表视图时,我得到错误的项目也

这里后产品Click事件是我等级:

class Friend 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Age { get; set; } 
    public string Gender { get; set; } 
} 

这里是我的好友适配器

class FriendsAdapter : BaseAdapter<Friend> 
{ 
    private Context mContext; 
    private int mRowLayout; 
    private List<Friend> mFriends; 


    public FriendsAdapter(Context context, int rowLayout, List<Friend> friends) 
    { 
     mContext = context; 
     mRowLayout = rowLayout; 
     mFriends = friends; 

    } 

    public override int Count 
    { 
     get { return mFriends.Count; } 
    } 

    public override Friend this[int position] 
    { 
     get { return mFriends[position]; } 
    } 

    public override long GetItemId(int position) 
    { 
     return position; 
    } 

    public override View GetView(int position, View convertView, ViewGroup parent) 
    { 
     View row = convertView; 

     if (row == null) 
     { 
      row = LayoutInflater.From(mContext).Inflate(mRowLayout, parent, false); 
     } 


     TextView firstName = row.FindViewById<TextView>(Resource.Id.txtFirstName); 
     firstName.Text = mFriends[position].FirstName; 

     TextView lastName = row.FindViewById<TextView>(Resource.Id.txtLastName); 
     lastName.Text = mFriends[position].LastName; 

     TextView age = row.FindViewById<TextView>(Resource.Id.txtAge); 
     age.Text = mFriends[position].Age; 

     TextView gender = row.FindViewById<TextView>(Resource.Id.txtGender); 
     gender.Text = mFriends[position].Gender; 



     return row; 
    } 

,这里是我的活动

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); 

     mTxtHeaderFirstName = FindViewById<TextView>(Resource.Id.txtHeaderFirstName); 
     mTxtHeaderLastName = FindViewById<TextView>(Resource.Id.txtHeaderLastName); 
     mTxtHeaderAge = FindViewById<TextView>(Resource.Id.txtHeaderAge); 
     mTxtHeaderGender = FindViewById<TextView>(Resource.Id.txtHeaderGender); 


     mSearch.Alpha = 0; 
     mContainer.BringToFront(); 

     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;//The Problem is Here: 

    } 
    private void Mlistview_ItemClick(object sender, AdapterView.ItemClickEventArgs e) 
    { 
     string test = mFriends[e.Position].FirstName; 
     Toast.MakeText(this, test, 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>(); 

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

问题是,当我的列表视图从searchBox过滤,我选择了一个项目它没有显示我正确的名称,但名称存在于我的具体列表位置的mitems。

我不知道如何解决这个问题。即使对于java也接受任何答案。我只需要一个解决方案来解决这个问题。下面请看

下面图片的代码工作正确 Here Code works right

在这里,我以错误的名称 Here i'm taking wrong Name

我读,我必须创建一个RecyclerView.Adapter.Is是正确的?怎么做到这一点?

+0

你正在引用mFriends这是你的全局变量......你将需要检索你的列表视图中的值 – Alander

+0

帮助我如何解决这个问题? – Dimitris

回答

0

替换行

string test = mFriends[e.Position].FirstName; 

string test = ((Friend)mAdapter.GetItem(e.Position)).FirstName; 

之所以这样,是在文本更改事件要创建一个新的列表新的适配器。该列表在mAdapter中可用。

+0

谢谢你的回答,但我面临的错误对象不包含定义佛名。 – Dimitris

+0

尝试将您从GetItem获得的对象转换为Friend对象,然后获取名字 – cvanbeek

+0

您能否举例说明我该如何做到这一点? – Dimitris

相关问题