首页 > 解决方案 > 访问 xamarin.android 中列表视图行内的文本视图

问题描述

我创建了一个列表视图,每行包含 5 个文本视图。现在我想点击最后一个文本视图并重定向到一个新页面。我的问题是我不知道如何访问文本视图。我尝试在我的自定义适配器中这样做:

var t = view.FindViewById<TextView>(Resource.Id.textView5);
            t.Click +=delegate {
                Android.Widget.Toast.MakeText(context, t.Text, Android.Widget.ToastLength.Short).Show();
              

            };

我用吐司只是为了看看这个功能是否有效。但它没有。当我运行应用程序并单击 textview 时,我一直在敬酒,但并没有停止。这样做的正确方法是什么?提前非常感谢。

标签: listviewxamarin.android

解决方案


此问题与列表视图项重用有关,请创建以下类。

 public class LocalOnclickListener : Java.Lang.Object, View.IOnClickListener
    {
        public void OnClick(View v)
        {
            HandleOnClick();
        }
        public System.Action HandleOnClick { get; set; }
    }

然后在您的 GetView 方法中,像下面的代码一样使用它。它将使单击事件在 TextView 中只执行一次。

 public override View GetView(int position, View convertView, ViewGroup parent)
        {
            View view = convertView;
            if (view == null) // no view to re-use, create new
                view = mainActivity.LayoutInflater.Inflate(Resource.Layout.layout1, null);
          
            TextView textView = view.FindViewById<TextView>(Resource.Id.textView1);
            textView.Text = items[position];
         

            var local = new LocalOnclickListener();
            local.HandleOnClick = () =>
            {
                Toast.MakeText(mainActivity, "click", ToastLength.Short).Show();
            };

            textView.SetOnClickListener(local);
            return view;
        }

或者您可以简单地使用以下代码。

 public override View GetView(int position, View convertView, ViewGroup parent)
        {
            View view = convertView;
            if (view == null) // no view to re-use, create new
                view = mainActivity.LayoutInflater.Inflate(Resource.Layout.layout1, null);
            view.FindViewById<TextView>(Resource.Id.My_textView1).Text = items[position];
            TextView textView = view.FindViewById<TextView>(Resource.Id.textView1);
            textView.Text = items[position];
            // textView.Click += TextView_Click;


            if (!textView.HasOnClickListeners)
            {
                textView.Click += (o, e) =>
                {
                    Toast.MakeText(mainActivity, "click", ToastLength.Short).Show();
                };
            }


           
            return view;
        }

这是一个类似的线程,您可以参考它:

https://forums.xamarin.com/discussion/9244/single-click-on-button-invoking-multiple-clicks


推荐阅读