ListView - 按钮更改同一行上的文本,但向下滚动时更改另一行上的文本

时间:2016-02-27 22:12:40

标签: android listview xamarin xamarin.android

问题是,当我点击itemTwo(按钮)时,它会更改该行和另一行的itemNum文本,反之亦然。 例如;在第1行:如果我点击按钮,它会更改该行的文本,但也会在我向下滚动时更改第6行的文本。

因此第1行和第6行彼此相同,第2行和第7行以及第3行和第8行相同。

当我向上滚动第一行的文本时,默认情况下第2行会更改为第一行的前一个文本,然后我向下滚动并返回一些行文本更改而不单击按钮

备注:我的列表视图有7行,但只显示4行。 ListView的高度为196dp,每个单元格/行的高度为49dp。

public class Holder : Java.Lang.Object
                {
                public TextView itemName
                    public TextView itemNum
                    public Button itemOne;
                    public Button itemTwo;
                    public int pos;

                public void Initialize(View view)
                {
                itemName = view.FindViewById<TextView> (Resource.Id.itemNameTextView);
                    itemNum = view.FindViewById<TextView> (Resource.Id.itemNumTextView);
                    itemOne = view.FindViewById<Button> (Resource.Id.itemOneButton);
                    itemTwo = view.FindViewById<Button> (Resource.Id.itemTwoButton);
                    itemTwo.Click += itemClick;
                }

                public void Bind(Activity context, string gn, int one, int two,  int num, int position)
                {
                    itemtName.Text = gn;
                    itemOne.Tag = one;
                    itemTwo.Tag = two;
                itemNum.Tag = num;
                    pos = position;
                }

                public void itemClick(object sender, EventArgs e)
                {
                    Button clickedButton = sender as Button;

                    int s = (int)clickedButton.Tag;

                    Console.WriteLine (s.ToString ());
                    switch ((int)clickedButton.Tag)
                    {
                    case 122:
                        itemNum.Text = "1";
                        break;
                    case 222:
                        itemNum.Text = "2";
                        break;
                    case 322:
                        itemNum.Text = "3";
                        break;
                    }
                }
            }


private class ItemListAdapter : BaseAdapter<Item>
        {
            private Activity activity;
            public List<Item> data;

            public ItemListAdapter(Activity activity, List<Item> data)
            {
                this.activity = activity;
                this.data = data;
            }
            public override Item this[int position]
            {
                get { return this.data [position]; }
            }

            public override int Count
            {
                get { return this.data.Count(); }
                //get {return 5;}
            }

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

            public override View GetView(int position, View convertView, ViewGroup parent)
            {
                Holder holder;

                if (convertView == null) 
                {
                    convertView = this.activity.LayoutInflater.Inflate (Resource.Layout.GarmentItem, null);
                    holder = new Holder ();
                    holder.Initialize (convertView);
                    convertView.Tag = holder;   
                }

            Item item = this.data [position];
            holder = (Holder)convertView.Tag;
                holder.Bind (this.activity, item.itemName, item.itemOneTag, item.itemTwoTag, itemNumTag, position);

                return convertView;    
            }

2 个答案:

答案 0 :(得分:1)

Android在其馆藏中重复使用Views。那么现在发生的是你点击一个单元格并设置itemNum的文本。然后滚动时,单击的单元格视图将重新用于集合中的新项目。由于您没有为itemNum设置默认值,因此先前设置的值会延续。

要解决此问题,您应该在视图中设置所有项目的默认值。在这种情况下,如果您在Bind方法中将itemNum.text设置为空字符串,它将解决您当前的问题。

答案 1 :(得分:0)

点击按钮后,您需要再次设置标记,当列表视图中有一个项目时,您需要确保在更改后重置标记