【问题标题】:ListFragment With Custom ArrayAdapter Scroll issueListFragment 与自定义 ArrayAdapter 滚动问题
【发布时间】:2015-03-05 08:35:21
【问题描述】:

您好,我是 Android/Xamarin Dev 的新手,我遇到了问题。我按照 here 的一个例子。我有一个带有 Custom ArrayAdapter 的 ListFragment 。我使它像this(ViewHolder)一样,当我向下滚动时,我的项目会感到困惑。我的意思是,如果我有一个包含 5 个项目的列表,并且当我向下滚动到其他项目时,一个项目的 textview 值为 10,则某些项目随机获取值 10,我逐步调试并且我的列表/数组不包含值 10,我找不到问题的根源。

当我停止使用这个时:

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

我没有问题,但我缺乏表现。

P.S 对不起我的英语,我是希腊人,对不起我的糟糕帖子我是新来的 :(

编辑这里是我的代码: 这方面的问题是当我让 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; }


}

【问题讨论】:

  • 如果你能展示你的代码,那么我们可以帮助yoj
  • 为什么我得到-1?我知道我的问题很难阅读,但我现在不能做得更好:(

标签: c# android xamarin fragment adaptor


【解决方案1】:

问题是您将值存储在 NumberTextView 中,它是持有者中的视图。 ViewHolder 模式以一种在 holder 为空时初始化视图的方式提高性能。这意味着 TextView(NumberTextView) 的一个实例会在 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--;
    }
}

【讨论】:

  • 发布您的适配器的 getView() 方法代码,以便我可以过滤掉实际问题。
  • 非常感谢@stofo89 ...最后我开始更好地了解Android..祝你有美好的一天:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多