单击 main activity 上的按钮后更新 ViewPager 片段部分内的适配器?
Update an Adapter inside a Fragment part of a ViewPager after a button click on main activity?
我正在更新我的应用程序布局以使用 Fragments,在 viewpager 中使用滑动标签。
我的 Main Activity 上有一个擦除数据库的按钮,我希望该按钮也 "refresh" 片段中的适配器。以前没有片段我只是使用 adapter.notifyDatasetHasChanged() 并且它工作正常。现在的问题是我不知道如何告诉片段 Main Activity 中的按钮已被单击。
我研究过使用接口,但我无法在片段上应用方法 (fragment.setListener..),因为它使用的是视图寻呼机,我无法检索它。
将实现碎片化到 MainActivity 中:
ViewPager viewPager = findViewById(R.id.viewpager);
SimpleFragmentPagerAdapter adapter = new SimpleFragmentPagerAdapter(this, getSupportFragmentManager());
viewPager.setAdapter(adapter);
TabLayout tabLayout = findViewById(R.id.tabs);
tabLayout.setupWithViewPager(viewPager);
在片段中:
final AppDatabase db = Room.databaseBuilder(getContext(), AppDatabase.class, "database")
.allowMainThreadQueries().build();
taskList = db.TaskDao().getAllTasks();
final TaskAdapter taskAdapter = new TaskAdapter(getActivity(), taskList);
listView.setAdapter(taskAdapter);
我希望能够通知此适配器 (taskAdapter) 当我按下 MainActivity 中的按钮时数据集已更改。
简单片段页面适配器:
public class SimpleFragmentPagerAdapter 扩展了 FragmentPagerAdapter {
/** Context of the app */
private Context mContext;
public SimpleFragmentPagerAdapter(Context context, FragmentManager fragmentManager) {
super(fragmentManager);
mContext = context;
}
@Override
public Fragment getItem(int position) {
switch (position)
{
case 0: return new MondayFragment();
case 1: return new TuesdayFragment();
default: return null;
}
}
@Override
public int getCount() {
return 2;
}
@Nullable
@Override
public CharSequence getPageTitle(int position) {
switch (position)
{
case 0: return "Lunedì";
case 1: return "Martedì";
default: return "DEF_PAGE_TITLE";
}
}
}
主要Activity的布局是:
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.material.tabs.TabLayout
android:id="@+id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<androidx.viewpager.widget.ViewPager
android:id="@+id/viewpager"
android:layout_below="@+id/tabs"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/add_task_fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentBottom="true"
android:layout_marginEnd="16dp"
android:layout_marginBottom="16dp"
android:src="@drawable/round_add_black_48dp" />
</RelativeLayout>
要刷新片段中的适配器,请在 activity 事件
中写入此内容
MondayFragment myfragment = (MondayFragment) adapter.getItem(0);
myfragment.refresh();
以及周一的片段写入功能
public void refresh(){
if(taskAdapter != null){
taskAdapter.notifydatasetchanged()
}
}
我正在更新我的应用程序布局以使用 Fragments,在 viewpager 中使用滑动标签。 我的 Main Activity 上有一个擦除数据库的按钮,我希望该按钮也 "refresh" 片段中的适配器。以前没有片段我只是使用 adapter.notifyDatasetHasChanged() 并且它工作正常。现在的问题是我不知道如何告诉片段 Main Activity 中的按钮已被单击。
我研究过使用接口,但我无法在片段上应用方法 (fragment.setListener..),因为它使用的是视图寻呼机,我无法检索它。
将实现碎片化到 MainActivity 中:
ViewPager viewPager = findViewById(R.id.viewpager);
SimpleFragmentPagerAdapter adapter = new SimpleFragmentPagerAdapter(this, getSupportFragmentManager());
viewPager.setAdapter(adapter);
TabLayout tabLayout = findViewById(R.id.tabs);
tabLayout.setupWithViewPager(viewPager);
在片段中:
final AppDatabase db = Room.databaseBuilder(getContext(), AppDatabase.class, "database")
.allowMainThreadQueries().build();
taskList = db.TaskDao().getAllTasks();
final TaskAdapter taskAdapter = new TaskAdapter(getActivity(), taskList);
listView.setAdapter(taskAdapter);
我希望能够通知此适配器 (taskAdapter) 当我按下 MainActivity 中的按钮时数据集已更改。
简单片段页面适配器:
public class SimpleFragmentPagerAdapter 扩展了 FragmentPagerAdapter {
/** Context of the app */
private Context mContext;
public SimpleFragmentPagerAdapter(Context context, FragmentManager fragmentManager) {
super(fragmentManager);
mContext = context;
}
@Override
public Fragment getItem(int position) {
switch (position)
{
case 0: return new MondayFragment();
case 1: return new TuesdayFragment();
default: return null;
}
}
@Override
public int getCount() {
return 2;
}
@Nullable
@Override
public CharSequence getPageTitle(int position) {
switch (position)
{
case 0: return "Lunedì";
case 1: return "Martedì";
default: return "DEF_PAGE_TITLE";
}
}
}
主要Activity的布局是:
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.material.tabs.TabLayout
android:id="@+id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<androidx.viewpager.widget.ViewPager
android:id="@+id/viewpager"
android:layout_below="@+id/tabs"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/add_task_fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentBottom="true"
android:layout_marginEnd="16dp"
android:layout_marginBottom="16dp"
android:src="@drawable/round_add_black_48dp" />
</RelativeLayout>
要刷新片段中的适配器,请在 activity 事件
中写入此内容MondayFragment myfragment = (MondayFragment) adapter.getItem(0);
myfragment.refresh();
以及周一的片段写入功能
public void refresh(){
if(taskAdapter != null){
taskAdapter.notifydatasetchanged()
}
}