簡體   English   中英

過濾后單擊列表視圖時出現錯誤的項目

[英]I'm getting Wrong item when clicking listview after filtering it

我正在使用JoeRock的Channel中的示例。當我在過濾列表視圖后使用項目單擊事件時存在問題

這是我的課:

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,也可以接受任何答案。 我只需要解決此問題的解決方案。 在下面看圖片

代碼在這里工作正常 代碼在這里工作正常

我在這里取錯名字 我在這里取錯名字

我讀到我必須創建一個RecyclerView.Adapter,對嗎? 怎么辦呢?

更換線

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

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

原因是在文本更改事件中,您正在使用新列表創建新的適配器。 該列表在mAdapter中可用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM