单击列表视图中的项目后导航到新片段

navigate to a new fragment upon clicking on an item in listview

所以我创建了一个列表视图,每行有 5 个文本视图。最后一个 textview 应该让我在被点击时获得有关某些项目的信息。我的列表视图的适配器有一个对应于片段的上下文。

 List<itemproperties> items;
        itemdisplay context;
        public homeadapter(itemdisplay context, List<itemproperties> items)
            : base()
        {
            this.context = context;
            this.items = items;
        }

其中 itemdisplay 是片段。这是我在点击 textview

时尝试导航到新片段的代码
 TextView textView = view.FindViewById<TextView>(Resource.Id.textView5);
            
            Fragment1 fragment = new Fragment1();
            if (!textView.HasOnClickListeners)
            {
                textView.Click += (o, e) =>
                {
                    SupportFragmentManager.BeginTransaction()
                            .Replace(Resource.Id.mainFrame, fragment)
                            .Commit();
                };
            } 

以上所有代码都在我的适配器中。但我收到一个错误,因为我猜适配器中似乎不存在 SupportFragmentManager。所以我的问题是,我该怎么做? 非常感谢。

你想达到如下GIF效果吗?

如果是这样,您的 Adatper 需要在构造函数中使用 mainActivity 属性,然后在 GetView 方法中使用以下方式。

   class MyAdapter : BaseAdapter<string>
    {
        private MainActivity mainActivity;
        private string[] items;

        public MyAdapter(MainActivity mainActivity, string[] items)
        {
            this.mainActivity = mainActivity;
            this.items = items;
        }

       
        public override string this[int position] => items[position];

        public override int Count => items.Length;

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

        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];
           

            if (!textView.HasOnClickListeners)
            {
                textView.Click += (o, e) =>
                {
                    Fragment1 fragment = new Fragment1();

                    FragmentTransaction transaction = mainActivity.FragmentManager.BeginTransaction();
                    transaction.Replace(Resource.Id.FramePage, fragment);
                    transaction.AddToBackStack("main");
                    transaction.CommitAllowingStateLoss();
                    //  Toast.MakeText(mainActivity, "click", ToastLength.Short).Show();
                };
            }


          
            return view;
        }

      
    }

   
}

如果你转fragment布局,你发现之前的listview还是存在的。请在您的 activity_main.xml 和 Fragment 布局中添加 android:background="?android:windowBackground",如下面的代码。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
                android:background="?android:windowBackground"
    android:layout_width="match_parent"
    android:layout_height="match_parent">


  <FrameLayout
     android:id="@+id/FramePage"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
    
       >
    <ListView
    android:id="@+id/listview"
    android:layout_width="match_parent"
    android:layout_height="200dp"
    android:choiceMode="singleChoice"/>

  </FrameLayout>
</RelativeLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
     android:background="?android:windowBackground"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
     <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="Hello World!" />
</LinearLayout>