-1

こんにちは、私は Android/Xamarin Dev の初心者で、問題があります。hereの例に従います。Custom ArrayAdapter を持つ ListFragment があります。このように(ViewHolder)作成し、下にスクロールするとアイテムが混乱します。私が意味するのは、5つのアイテムを持つリストがあり、1つのアイテムに値10のテキストビューがある場合、他のアイテムまでスクロールすると、いくつかのアイテムがランダムに値10を取得し、段階的にデバッグし、リスト/配列に含まれていません値が 10 で、問題の原因がわかりません。

これの使用をやめると:

if (view != null)
{
    holder = view.Tag as MenuItemHolder;
}

問題はありませんが、パフォーマンスが不足しています。

PS 私の英語で申し訳ありません。

ここで編集は私のコードです:これの問題は、私がholder.NumberTextView.Text +1を作るときですが、スクロールすると+1が他のアイテムにランダムになります

public override View GetView(int position, View convertView, ViewGroup parent)
        {
            MenuItemHolder holder = null;

            var view = convertView;

            if (view != null)
            {
                holder = view.Tag as MenuItemHolder;
            }
            if (holder == null)
            {
                holder = new MenuItemHolder();

                view =LayoutInflater.From(Context).Inflate(Resource.Layout.rowWithButtons, null);
            holder.RemoveButton = view.FindViewById<Button>(Resource.Id.DecreaseButton);
            holder.AddButton = view.FindViewById<Button>(Resource.Id.IncreaseButton);
            holder.NumberTextView = view.FindViewById<TextView>(Resource.Id.NumberTextView);
              holder.AddButton.Click += delegate
                {                        
                    holder.NumberTextView.Text = (Convert.ToInt32(holder.NumberTextView.Text) + 1).ToString();
                };

              holder.RemoveButton.Click += delegate
                {
                    if ((Convert.ToInt32(holder.NumberTextView.Text) > 1))
                    {
                        holder.NumberTextView.Text = (Convert.ToInt32(holder.NumberTextView.Text) - 1).ToString();
                    }
                };

           view.Tag = holder;

            }
           holder.Title.Text = GetItem(position).Name;




            return view;
        }


public class MenuItemHolder : Java.Lang.Object
{
   public TextView Title { get; set; }

    public Button OptionsButton{ get; set; }

    public TextView NumberTextView{ get; set; }

    public  Button AddButton{ get; set; }

    public  Button RemoveButton{ get; set; }

    public Button DoneButton { get; set; }


}
4

1 に答える 1

0

問題は、ホルダーのビューである NumberTextView に値を保存することです。ViewHolder パターンは、ホルダーが null の場合にビューを一度初期化する方法でパフォーマンスを向上させます。つまり、TextView(NumberTextView) の 1 つのインスタンスが ListView のすべての項目を描画します。そのため、値を増やして NumberTextView に格納すると、値がすべてのリスト項目に設定されます。リストは再描画されないため、すぐにはわかりません。スクロールして新しいリスト項目が画面に描画されると、同じ値が増加します。

解決策は、すべてのリスト項目の値を別の場所に保存することです。GetItem メソッドで取得したオブジェクトにフィールドを追加します。

例えば:

public override View GetView(int position, View convertView, ViewGroup parent)
    {
        MenuItemHolder holder = null;
        var view = convertView;
        YourItemClass item = GetItem(position);

        if (view != null)
        {
            holder = view.Tag as MenuItemHolder;
        }
        if (holder == null)
        {
            holder = new MenuItemHolder();

            view = LayoutInflater.From(Context).Inflate(Resource.Layout.rowWithButtons, null);
            holder.RemoveButton = view.FindViewById<Button>(Resource.Id.DecreaseButton);
            holder.AddButton = view.FindViewById<Button>(Resource.Id.IncreaseButton);
            holder.NumberTextView = view.FindViewById<TextView>(Resource.Id.NumberTextView);

            holder.AddButton.Click += delegate
            {                        
                item.increaseValue();
                holder.NumberTextView.Text = (item.Value).ToString();
            };

            holder.RemoveButton.Click += delegate
            {
                if (item.Value > 1))
                {
                    item.decreaseValue();
                    holder.NumberTextView.Text = (item.Value).ToString();
                }
            };

            view.Tag = holder;

        }
        holder.Title.Text = GetItem(position).Name;
        holder.NumberTextView.Text = (item.Value).ToString();

        return view;
    }


public override YourItemClass GetItem(int position) 
{
    if(listOfItems != null)
        return listOfItems.ElementAt(position); 
    return null;
}


class YourItemClass
{
    public string Name { get; set; }
    public string Value { get;set; }

    public void increaseValue()
    {
        Value++;
    }

    public void decreaseValue()
    {
        Value--;
    }
}
于 2015-03-05T09:21:18.463 に答える