滚动时在自定义ListView中获取错误的位置

时间:2014-06-26 07:17:55

标签: xamarin xamarin.android android-adapter android-viewholder

滚动时,我在自定义ListView中出现位置错误。

我尝试了ViewHolder模式和ArrayAdapter,但都提出了同样的问题。

如果我使用Java重现代码,那么我在滚动时会获得正确的位置。

Xamarin架构错误是什么?

以下是我的示例代码:

活动类

namespace ArrayAdapterDemoApp
{
    [Activity(Label = "ArrayAdapterDemoApp", MainLauncher = true, 
    Icon ="@drawable/icon")]
    public class MainActivity : Activity
    {
        private static List<DataBean> _ItemsList = new List<DataBean>();
        private static CustomAdapter _adapter;
        private ListView _listview;

        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);

            // Set our view from the "main" layout resource
            SetContentView(Resource.Layout.Main);

            // Get our button from the layout resource,
            // and attach an event to it
            _listview = FindViewById<ListView>(Resource.Id.mylist);
            DataBean obj1 = new DataBean();
            obj1.Name = "AA";
            obj1.City = "11";
            _ItemsList.Add(obj1);

            DataBean obj2 = new DataBean();
            obj2.Name = "BB";
            obj2.City = "22";
            _ItemsList.Add(obj2);

            DataBean obj3 = new DataBean();
            obj3.Name = "CC";
            obj3.City = "33";
            _ItemsList.Add(obj3);

            ...

            DataBean obj15 = new DataBean();
            obj15.Name = "OO";
            obj15.City = "1010";
            _ItemsList.Add(obj15);

            _adapter = new CustomAdapter(this, _ItemsList);
            _listview.Adapter = _adapter;
        }
    }
}

自定义适配器

namespace ArrayAdapterDemoApp
{
    public class CustomAdapter : ArrayAdapter<DataBean> 
    {
        private class TaskViewHolder : Java.Lang.Object
        {
            public TextView tvName;
            public TextView tvCity;
        }

        List<DataBean> listData;
        Activity _context;
        int _position;

        public CustomAdapter(Activity context, List<DataBean> dataList)
            : base(context, Resource.Layout.adapter_row, dataList)
        {
            this._context = context;
            this.listData = dataList;
        }

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

        public override int Count
        {
            get { return listData.Count; }
        }

        //With View Holder
        public override View GetView(int position, View convertView, ViewGroup parent)
        {
            DataBean data = listData[position];
            TaskViewHolder viewHolder= null; // view lookup cache stored in tag
            if (convertView == null)
            {
                viewHolder = new TaskViewHolder();
                LayoutInflater inflater = LayoutInflater.From(_context);
                convertView = inflater.Inflate(Resource.Layout.adapter_row, parent, false);

                viewHolder.tvName = convertView.FindViewById<TextView>(Resource.Id.text1);
                viewHolder.tvCity = convertView.FindViewById<TextView>(Resource.Id.text2);


                convertView.Tag = viewHolder;
            }

            if(viewHolder==null)
            {
                viewHolder = (TaskViewHolder)convertView.Tag;
            }

            viewHolder.tvName.Text = data.Name;
            viewHolder.tvCity.Text = data.City;

            return convertView;
        }
    }
}

DataBean类

namespace ArrayAdapterDemoApp
{
    public class DataBean
    {
        public string Name { get; set; }
        public string City { get; set; }
    }
}

3 个答案:

答案 0 :(得分:2)

我也有同样的问题所以我通过将位置标记到视图来解决它。例如。

// iv_delete是一个imageview

holder.iv_delete.Tag = position;

并从标记中获取位置

对我而言就是这样      int finalPosition =(Integer)holder.iv_delete.Tag.IntValue();

享受!!!!!

答案 1 :(得分:0)

在您的适配器类中添加此方法:

  public DataBean GetItemAtPosition(int position)
  {
       return this.listData[position];
  }

答案 2 :(得分:0)

您可以将每行的位置标记到控件以获取正确的位置或 另一种方法是使用动作事件绑定到每个视图行。这也解决了重复的方法调用问题。 这可能会有所帮助:http://appliedcodelog.blogspot.in/2015/07/working-on-issues-with-listview-in.html#WrongPosition