单击列表视图中的项目后导航到新片段
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>
所以我创建了一个列表视图,每行有 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>