在 TabLayout 和 ViewPager2 中执行异步任务后更新具有相同布局的多个片段
Posted
技术标签:
【中文标题】在 TabLayout 和 ViewPager2 中执行异步任务后更新具有相同布局的多个片段【英文标题】:Update multiple fragments with same layout after doing Async Task in TabLayout and ViewPager2 【发布时间】:2021-02-22 08:17:15 【问题描述】:我正在使用 TabLayout 和 ViewPager2 以显示最多 3 个具有相同布局的片段。每个选项卡一个片段。
异步任务完成后,所有 3 个片段都应更新自己的 ListView。所有片段共享相同的布局,但每个片段都有自己的 ListView 内容。
当用户点击特定按钮时触发异步任务。
我认为整个代码会很乱,所以这里是主要代码,我认为应该足够了:
MainActivity.class
// here we fire the async task if "buttonrefesh" is clicked
public boolean onOptionsItemSelected(MenuItem item)
int id = item.getItemId();
if (id == R.id.buttonrefresh) //refresh
new FetchAnuncios().execute();
return super.onOptionsItemSelected(item);
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Attaching the layout to the toolbar object
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
// Setting toolbar as the ActionBar with setSupportActionBar() call
setSupportActionBar(toolbar);
viewPager = findViewById(R.id.viewPager);
tabLayout = (TabLayout) findViewById(R.id.tabLayout);
pagerAdapter = new MyPagerAdapter(MainActivity.this);
viewPager.setAdapter(pagerAdapter);
new TabLayoutMediator(tabLayout, viewPager,(tab, position) -> tab.setIcon(icons[position])).attach();
MyPagerAdapter.class
private class MyPagerAdapter extends FragmentStateAdapter
public MyPagerAdapter(FragmentActivity fa)
super(fa);
@Override
public Fragment createFragment(int pos)
switch (pos)
case 0:
return Fragment_ma.newInstance("fragment 1");
case 1:
return Fragment_ma.newInstance("fragment 2");
case 2:
return Fragment_ma.newInstance("fragment 3");
default:
return Fragment_ma.newInstance("fragment 1, Default");
@Override
public int getItemCount() return 3;
Fragment_ma.class
public class Fragment_ma extends Fragment
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
View v = inflater.inflate(R.layout.fragment_ma, container, false);
return v;
public static Fragment_ma newInstance(String text)
Fragment_ma f = new Fragment_ma();
return f;
FetchAnuncios.class
private class FetchAnuncios extends AsyncTask<Void, Integer, ArrayList<AnuncioData>>
@Override
protected ArrayList<AnuncioData> doInBackground(Void... voids)
ArrayList<AnuncioData> arrayList = new ArrayList<AnuncioData>();
// here we do some I/O work to get arrayList with all the data that should be attached to each fragment ListView
return arrayList;
@Override
protected void onPostExecute(ArrayList<AnuncioData> arrayList)
super.onPostExecute(arrayList);
final ListView list = findViewById(R.id.list); // I know here is the problem, but can't imagine how to solve it
list.setAdapter(null);
if (arrayList.size()>0)
CustomAdapter customAdapter = new CustomAdapter(MainActivity.this, arrayList);
list.setAdapter(customAdapter);
如您所见,“onPostExecute”方法应该使用存储在 arrayList 上的数据(每个 ListView 上的不同内容)更新每个片段的 3 个 ListView。我怎样才能做到这一点?当我单击选项卡时会创建片段,而不是之前(最初可见的第一个除外)。那么我应该什么时候附加 listview 适配器以及如何附加?
【问题讨论】:
【参考方案1】:用这部分代码更新您的代码希望它会有所帮助并删除这部分代码 "list.setAdapter(null);"
if (arrayList.size()>0)
if(int i=0; i<arrayList.size()-1; i++)
CustomAdapter customAdapter = new CustomAdapter(MainActivity.this, arrayList.get(i));
list.setAdapter(customAdapter);
【讨论】:
这段代码有什么帮助?这只会更新一个 ListView,即 Tab1 中的那个【参考方案2】:我终于让它工作了。 主要变化:
在 doBackground 中创建 MyPagerAdapter 在将适配器设置为 viewpager 之前将 arrayList 传递给 MyPagerAdapter 实例 在片段列表类 (onCreate) 上设置列表适配器【讨论】:
以上是关于在 TabLayout 和 ViewPager2 中执行异步任务后更新具有相同布局的多个片段的主要内容,如果未能解决你的问题,请参考以下文章
如何更新 Tablayout 中的片段? (Viewpager2, FragmentStateAdapter)