【问题标题】:Update an Adapter inside a Fragment part of a ViewPager after a button click on main activity?在单击主要活动按钮后更新 ViewPager 的片段部分内的适配器?
【发布时间】:2020-01-09 13:17:25
【问题描述】:

我正在更新我的应用布局以使用 Fragments,在 viewpager 中使用滑动选项卡。 我的 Main Activity 上有一个用于擦除数据库的按钮,我希望该按钮也“刷新”片段中的适配器。以前没有片段,我只使用了 adapter.notifyDatasetHasChanged() 并且效果很好。问题是现在我不知道如何告诉片段主 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);

我希望能够在我按下 MainActivity 中的按钮时通知此适配器 (taskAdapter) 数据集已更改。

SimpleFragmentPagerAdapter:

公共类 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>

【问题讨论】:

  • 请分享您的 SimpleFragmentPagerAdapter 代码?????
  • 对不起,我现在加了。

标签: android android-fragments android-viewpager android-tablayout android-tabs


【解决方案1】:

要刷新片段内的适配器,请在 Event 上的活动中写入此内容

MondayFragment myfragment =  (MondayFragment)  adapter.getItem(0);
myfragment.refresh();

和MondayFragment写入函数

public void  refresh(){

if(taskAdapter != null){
taskAdapter.notifydatasetchanged()
}

}

【讨论】:

  • taskAdapter 是在片段的 onCreateView 内创建的,因此我无法从其他方法访问它。我尝试将其移出方法并使其成为最终结果,但现在它始终为空,因此不会刷新数据集。
  • 最终任务适配器任务适配器;在 onCreateView 之外创建全局,在 onCreateView 中只写 taskAdapter = new TaskAdapter(getActivity(), taskList)
  • 我错过了关键字 static 使其成为全球性的,现在它正在工作。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多