2017-10-15 30 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

相關問題