在 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 【问题描述】:

我正在使用 TabLayoutViewPager2 以显示最多 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 中执行异步任务后更新具有相同布局的多个片段的主要内容,如果未能解决你的问题,请参考以下文章

由于 ViewPager2 导致 TabLayout 损坏

android使用Tablayout+viewpager2

TabLayout+ViewPager2的联合使用

如何更新 Tablayout 中的片段? (Viewpager2, FragmentStateAdapter)

ViewPager2 TabLayout Fragment RecyclerView滑动冲突

ViewPager2&TabLayout:拓展出一个文本选中放大效果