【问题标题】:accessing a textview inside a row of a listview in xamarin.android访问 xamarin.android 中列表视图行内的文本视图
【发布时间】:2020-07-22 12:27:52
【问题描述】:

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

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

            };

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

【问题讨论】:

    标签: listview xamarin.android


    【解决方案1】:

    此问题与listview item重用有关,请创建以下类。

     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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多