0

スクロール中にカスタムで間違った位置を取得しています。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; }
    }
}
4

3 に答える 3

2

私も同じ問題を抱えていたので、ビューに位置をタグ付けするだけで解決しました。

//iv_delete はイメージビューです

holder.iv_delete.Tag = 位置;

タグから位置を取得します

私にとっては、 int finalPosition = (Integer)holder.iv_delete.Tag.IntValue(); のようでした。

楽しみ!!!!!

于 2015-01-08T13:50:01.247 に答える
0

各行の位置をコントロールにタグ付けして、正しい位置を取得するか、別の方法として、各ビュー行にアクション イベント バインディングを使用します。これにより、重複するメソッド呼び出しの問題も解決されます。これは役立つかもしれません: http://appliedcodelog.blogspot.in/2015/07/working-on-issues-with-listview-in.html#WrongPosition

于 2015-07-14T08:53:52.513 に答える